|
Hi all,
I'm writing a toolbar for IE. I want to open a menu (or a simple window - not a dialog) that will open outside of the toolbar space (but inside IE).
I want to catch the mousemove, and to draw my own graphics which change depending on the mouse location.
I tried using TrackPopupMenu, however I didn't find any way to catch the mouse-move, or to draw the menu on my own.
I'm using WTL.
Thanks a lot,
Amos
|
|
|
|
|
Hi All,
I have developed a ATL COM which has a dependency , i have registered callback function of ATL COM to the dependency , which is ultimately invoked by one of the thread of the dependency and i am firing Event when callback funciton is invoked from callback function in ATL COM ,
Also i have implemented the way it is given the to fire event from Worker thread
including atlcmplimpl.h ..... etc..
The event is fired from the worker thread correctly but ..
My problem is in Internet Explorer , When ATL COM fires event once , the event is shown on internet explorer more than once as if event is fired many times... i.e each event is shown repeatedly and count is increasing every time..
I have tested ATL COM on VB Client it is working fine on the VB but it is giving problem in the internet explorer...
Here is the code snippet...
//EventCallBack is registered as call back function in depedency module
// It is static function of CCallMonitor as it was to be registered as
//callback function
int CCallMonitor::EventCallBack(void* pData)
{
HRESULT hRes = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
MessageBox(NULL,TEXT("Fire Event Reached"),TEXT("OK"),MB_OK);
//g_CallMonitor is the pointer to the COM CLass
g_CallMonitor->Fire_IncomingCall((BSTR)Objbstr);
::CoUninitialize ();
MessageBox(NULL,TEXT("After Test Reached"),TEXT("OK"),MB_OK);
return S_OK;
}
MessageBox for debugging purpose only...
Please let me what is the problem with the same...
with regards
Abhiraj
|
|
|
|
|
Hi all, I am relatively new to ATL/Com but I have some understanding.
I've stolen code from one project and put it in another project. I then modified it for this project's task. The two are 99% the same, except for the sink object. It is pretty standard code really. First I init the interface:
<br />
HRESULT hr=S_OK;<br />
hr = CoCreateInstance(__uuidof(StorageCOM), NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pIUnknown);<br />
if (SUCCEEDED(hr))<br />
{<br />
hr = pIUnknown->QueryInterface(__uuidof(IStorageCOM), (void **)&pStorageIF);<br />
if (SUCCEEDED(hr))<br />
{ <br />
<br />
} else <br />
qDebug() << "GridWrapper::GridWrapper pIUnknown->QueryInterface(__uuidof(IStorageCOM)...) failed";<br />
<br />
} else <br />
qDebug() << "GridWrapper::GridWrapper CoCreateInstance(__uuidof(StorageCOM)...) failed ";
Then I try to make the sink and subscribe it to events:
<br />
CComObject<storageeventsink>::CreateInstance(&pSinkObj);<br />
long hr=S_OK;<br />
hr = pSinkObj->QueryInterface(IID_IUnknown, (void**)&pEventSink);<br />
<br />
if (pEventSink && SUCCEEDED(hr))<br />
{<br />
hr = AtlAdvise(pIUnknown, pEventSink, DIID_IChunkEvent, &sinkCookie);<br />
if (SUCCEEDED(hr))<br />
{<br />
qDebug() << "connecting to psinkobj=" << pSinkObj;<br />
if (connect(pSinkObj, SIGNAL(chunkReady(QByteArray)), this, SLOT(onChunkReady(QByteArray))))<br />
{<br />
QSignalSpy spy(pSinkObj, SIGNAL(chunkReady(QByteArray)));<br />
qDebug() << "Spying on psinkobj=" << pSinkObj;<br />
int x = pStorageIF->GetChunkedFile((unsigned char *)UUID.data(), cookie);<br />
qDebug() << "pSinkObj emitted" << spy.signal() << spy.count() << "times";<br />
} else qDebug() << "connect of sink to this failed";<br />
AtlUnadvise(pIUnknown, DIID_IChunkEvent, sinkCookie);<br />
} else qDebug() << "AtlAdvise failed";<br />
} else <br />
qDebug() << "GridWrapper::GridWrapper pSinkObj->QueryInterface(IID_IUnknown, pEventSink) failed";<br />
<br />
pEventSink->Release();<br />
<br />
</storageeventsink>
The problem I am running into is in STDMETHODIMP IConnectionPointImpl<t, piid,="" cdv="">::Advise(IUnknown* pUnkSink,DWORD* pdwCookie)</t,> (of atlcom.h)
Where it says :
<br />
*pdwCookie = m_vec.Add(p);
For m_vec, m_ppUnk==NULL and m_nSize=0
This add() actually fails, and I have no idea why.
I am hoping someone has a better idea than myself of what might be going wrong. Thanks!
EDIT: It seems that
inline DWORD CComDynamicUnkArray::Add(IUnknown* pUnk)<br />
<br />
ATLTRY(pp = (IUnknown**)calloc(sizeof(IUnknown*),_DEFAULT_VECTORLENGTH));<br />
is failing
modified on Thursday, May 1, 2008 2:42 PM
|
|
|
|
|
I did a window just for the menu so inherit from CFrameWindowImpl.
Then I add dynamic items to the menu.
I captured the MSG_WM_MENUCOMMAND(OnMenuCommand)
In the function "OnMenuCommand" I try to get the information of the item ...
The menu handle was invalid...
So I did a test and found out so
The message "MSG_WM_UNINITMENUPOPUP" is sent before the message "MSG_WM_MENUCOMMAND"
Why is it so? and how I can solve the problem?
Thanks in advence
|
|
|
|
|
Hi!
I'm Rathakrishnan. I'm new to ATL. I've to develop a customized tool bar project for web. I've a sample code. When I debug the code, it gives me the following two kind of errors:
(i)error C2787: 'IInputObject' : no GUID has been associated with this object
(ii)error C2440: 'initializing' : cannot convert from 'DWORD_PTR' to 'const IID *'
The error prone code is:
BEGIN_COM_MAP(CStockBar)
COM_INTERFACE_ENTRY(IStockBar)
COM_INTERFACE_ENTRY(IInputObject)
COM_INTERFACE_ENTRY(IOleWindow)
COM_INTERFACE_ENTRY_IID(IID_IDockingWindow, IDockingWindow)
COM_INTERFACE_ENTRY(IObjectWithSite)
COM_INTERFACE_ENTRY_IID(IID_IDeskBand, IDeskBand)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
What might be the problem? How do I resolve this?
|
|
|
|
|
Microsoft's compiler allows you to associate an interface with its IID. This means that for such an interface, the compiler can give you a reference to the IID.
To associate an interface with an IID, you use the __declspec(uuid()) directive. Example:
struct __declspec(uuid("D97A6DA0-A85D-11CF-83AE-00A0C90C2BD8")) IMyInterface { ... }; This tells the compiler to create an IID in static memory with the specified value. A pointer to the IID is then acquired by using the __uuidof() operator like this:
const IID* pIID = __uuidof(IMyInterface)
If you use Microsoft's IDL compiler (MIDL), the association between interface and IID is made automatically for you. Also, most of the system interfaces (IUnknown , IDispatch , etc.) also have this feature.
It would seem to me that there is no IID associated with IInputObject. There is most likely an IID variable declared somewhere that you can use. Have you tried swapping COM_INTERFACE_ENTRY(IInputObject) with COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject) ?
--
Kein Mitleid Für Die Mehrheit
|
|
|
|
|
Hello dear friends,
How can we Use ATL COM dll in JavaScript?
Suppose I've one function in CoClass of COM DLL that looks like as below
STDMETHODIMP CQpOffice::SayHello(BSTR *String,BOOL *Success)
How can I call this function from the Javascript.
A sample code will be appreciated.
Thanks in advance to all of you.
ritz1234
|
|
|
|
|
|
You've also to make sure your COM class implements the IDispatch interface.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
Thanks for the reply,
The problem is when I run the JScript in Mozilla Firefox browser it says
that ActiveX object is not defined.
My CoClass is defined as shown below.
class ATL_NO_VTABLE CQpOffice :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CQpOffice, &CLSID_QpOffice>,
public IDeskBand,
public IObjectWithSite,
public IDispatchImpl<IQpOffice, &IID_IQpOffice, &LIBID_AUTOUPDATETBLib>
and the interface method is defined as
STDMETHODIMP CQpOffice::Hello2(BSTR *String)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
if(!String)
return(E_POINTER);
*String=::SysAllocString(L"Hello2!");
return S_OK;
}
and the JScript to call the interface method is defined as
var obj;
obj= new ActiveXObject("AUTOUPDATETBLib.QpOffice");
alert(obj.Hello2());
What could be the problem so I received the error "ActiveX object not defined" the COM DLL is registered in the system and I can see the CoClass and Interface method in "Object Browser" in Visual Basic 6.0.
ritz1234
|
|
|
|
|
ritz1234 wrote: ("AUTOUPDATETBLib.QpOffice"
Is that the right progID (you may use OLEVIEW to check it)?
Are you able to late bind the control using Visual Basic 6 ?
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
Thanks for the reply cPallini.
yes,that was the wrong progId.
I realized that and changed the code in JScript as below
var ob;
ob= new ActiveXObject("AutoUpdateTB.QpOffice");
alert(ob.Hello2());//Hello2 is the interface method that returns a string
When I drag and drop the html page that has the above mention code the
Internet explorer ask for weather to allow the interaction with the
ActiveX or not, that means the progId is right in this case.But when I
press "Yes" button the messagebox that should be display doesn't appear.
And when I double click at the left most icon located at the bottom
status bar it says "Automation server can't create object".
Pls tell me what is the reason.
1 more question.
1)Is it possible to call the COM DLL method in such a way, that when we call the method the messagebox that Internet Explorer ask for weather to allow the activex to interact doesn't appear?
ritz1234
|
|
|
|
|
I'm implementing a dialog that inherits off CSimpleDialog that's part of a CAtlDllModuleT. The dialog loads fine, but one of the things I'm trying to do is to move the resource of the dialog into a different DLL, to make it easier to internationalize (replace the dialog text, etc).
I know how to load the resource DLL, but I'm unsure of how to tell my dialog class to specifically load the dialog resource from that DLL.
Thanks in advance for any suggestions. If I'm not clear in anything, do ask me to clarify.
|
|
|
|
|
|
How to handle COM Events in Java script
How to use ATL COM in java script and handle COM event in java script
if the ATL COM is developed in C++
Abhiraj
modified on Tuesday, April 29, 2008 2:43 AM
|
|
|
|
|
|
Hi Steve
You took the question wrong ...
The question is how to handle events in Java script which are fired from ATL COM
I am able to call COM interface methods in java scripts but not able to handle events fired from the same ATL COM Component
and not "call java script functions in C++"
with regards
Abhiraj
|
|
|
|
|
You haven't explained properly. How is the ATL COM object hosted? If it's hosted on the page you can simply handle it like any other event in HTML. It it's not on the page you would sink the events with an interface implemented in C/C++ and the methods would delegate to the web page as described in my previous post.
Steve
|
|
|
|
|
Hi Steve
I would like to change my question...
How to use ATL COM in java script and handle COM event in java script
if the ATL COM is developed in C++
Abhiraj
|
|
|
|
|
Firstly, I’ll assume you’re embedding a COM object in a HTML page (you haven’t explicitly stated this). Here’s what my page looks like:
<html>
<head>
<title>CallMe</title>
</head>
<body>
<object id="my_obj" classid="clsid:7815559F-240E-406E-A0F0-974B7272C65F">
</object>
<script type="text/javascript" for="my_obj" event="Hello">
window.alert("Hello!");
</script>
<input type="button" value="Call into COM object" onclick="my_obj.CallMe();" />
</body>
</html>
Note that I used MSVC6, but other versions will have equivalent functionality.
You’ll have to use connection points to implement an outgoing interface. Here’s the IDL of my project:
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(4E413D85-21DC-48FC-AD65-B8635B74CBFF),
dual,
helpstring("IHostMeObj Interface"),
pointer_default(unique)
]
interface IHostMeObj : IDispatch
{
[id(1), helpstring("method CallMe")] HRESULT CallMe();
};
[
uuid(9598F3A4-B8DE-4BA8-9AE1-90903ED9EF38),
version(1.0),
helpstring("HostMe 1.0 Type Library")
]
library HOSTMELib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(5C211D24-97D2-4AA1-AB93-EE605DC97614),
helpstring("_IHostMeObjEvents Interface")
]
dispinterface _IHostMeObjEvents
{
properties:
methods:
[id(1), helpstring("method Hello")] void Hello();
};
[
uuid(7815559F-240E-406E-A0F0-974B7272C65F),
helpstring("HostMeObj Class")
]
coclass HostMeObj
{
[default] interface IHostMeObj;
[default, source] dispinterface _IHostMeObjEvents;
};
};
It’s also important to implement the IProvideClassInfo and IProvideClassInfo2 interfaces or the callbacks will not work.
The following articles (on the Wayback Machine, as the originals seem to have been deleted) may help:
http://web.archive.org/web/20060915111734/http://msdn.microsoft.com/archive/en-us/dnarguion/html/drgui082399.asp[^]
http://web.archive.org/web/20060921072123/http://msdn.microsoft.com/archive/en-us/dnarguion/html/drgui102599.asp[^]
Steve
|
|
|
|
|
Hi Steve
I have implemented the IProvideClassInfo and IProvideClassInfo2 interfaces for the callbacks and the callback are working fine
Now the issue is even if I fire Event from ATL COM once , its shown more than once on the web page as if i have fired event from ATL COM many times and everytime the count is getting increased ....
I have used this ATL Component in VB also , in VB its working fine if event is fired once the event is shown once and not more than that...
Here is the code snippet
......
MessageBox(NULL,TEXT("Fire Event Reached"),TEXT("OK"),MB_OK);
hr = pConnection->Invoke(1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, &varResult, NULL, NULL);
MessageBox(NULL,TEXT("Fire Event Complete"),TEXT("OK"),MB_OK);
.........
I have used two message boxes just for the sake for debugging...
Now in VB whenever there is event i have shown a msg box so once event is fired only 3 messages boxes comes one after the other
1. Fired Event Reached
2. Event Message Box (When "pConnection->Invoke" is fired)
3. Fire Event Complete
Now in Internet Explorer its different.. whenever event is fired by ATL COM
Event Message Box is shown many times in the Internet Explorer and everytime the count is getting increased
What can be the problem...
with regards
Abhiraj
|
|
|
|
|
Why are you firing the event manually using IDispatch::Invoke . The ATL wizard generates that code for you when you select the “Implement Connection Point…” option in the IDE.
Steve
|
|
|
|
|
I am not firing the event manually.. i am using the code generated by the ATL Wizard as such..
For firing event from worker thread .... microsoft has given link to be implemented for the same thats the only change i have done and rest of the code i have not touched...
with regards
Abhiraj
modified on Wednesday, May 7, 2008 12:27 AM
|
|
|
|
|
Hi all!
I would like to serialize/deserialize a std::vector of objects of a class into some buffer of a stream or of some other buffer. Can you address me about how to do this with the highest performance possible?
If I had an ARRAY of these instances..I would switch to a std::vector using this code:
CMyClass d[20];
// fill the array!
std::vector<CMyClass> v(d,d+sizof(d)/(d[0]));
What in case I use deserialization from a stream?
Is there a way to let the std::vector copy or use itself access the buffer
of a stream?
I would like to avoid the istream::read line below to go faster..do you know some way or address some nice super STL feature?
CMyClass d[20]; // buffer is created continuosly
istream::read( d, 20 ); // copy data from the buffer ( IS AVOIDABLE? )
std::vector<CMyClass> v( d,d+sizof(d)/(d[0])); // get the std::vector
Kind Regards
ManuStone
|
|
|
|
|
Assuming CMyClass has a std::istream extractor, you could use this to read from a file called "a.a"
std::ifstream is("a.a");
std::vector<CMyClass> v;
std::copy(std::istream_iterator<CMyClass>(is), std::istream_iterator<CMyClass>(), std::back_inserter(v));
|
|
|
|
|