The problem is in your calls to CoInitializeEx and CoUninitialize.
respectively) and you should be fine.
I am getting this error when calling GetInterfaceFromGlobal in an
extension dll in my ATL server. My calling code looks like this:
HRESULT result = ::CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
CComPtr< IMyCallback > myCallback;
HRESULT result = globalInterfaceTable-
GetInterfaceFromGlobal( gitCookie,
IID_IAtlMyCallback, ( VOID ** )&myCallback );
CoUninitialize();
I know the code is good because I can put it directly in a spawned
worker thread and the GIT call returns S_OK. Also, since my
application code is well tested, I know the problem is not in the
thread switching or the extension dll loading or execution. This means
that either ATL GIT marshalling has a problem with PostThreadMessage
or extension dlls.
To test this out, I put the above code directly into the
PostThreadMessage handler and it too worked fine returning an S_OK.
But going one step further and calling a function in the extension dll
from the message handler, and the code fails returning E_NOINTERFACE.
Is there some peculiarity with marshalling that I don't know? I am
using the STA threading model. I'm an old hand at MFC and threads, but
am relatively new concerning ATL's need for marshalling across threads
in an ATL Server.