marshalling an interface pointer
Hello,
I've created an ATL project using VS2008, with the option merge
proxy/stub checked. All of the COM interfaces are set to
CComObjectRootEx<CComMultiThreadModel>
The .idl layout is
[
object,
uuid(B7A09AF3-2868-11DF-8A39-001CC0A3A714),
oleautomation,
dual,
nonextensible,
helpstring("IMEDPositionData Interface"),
pointer_default(unique)
]
interface IMEDPositionData : IDispatch{
/*various functions*/
};
[
object,
uuid(B7A09AF5-2868-11DF-8A39-001CC0A3A714),
oleautomation,
dual,
nonextensible,
helpstring("IMEDPositionDevice Interface"),
pointer_default(unique)
]
interface IMEDPositionDevice : IDispatch{
/*various functions*/
[id(15), helpstring("method Read")] HRESULT Read([in] REFIID riid,
[out] IUnknown** pData);
};
The calling application is also set to multi-threaded apartment. When
the calling application calls the read function
CComPtr<IMEDPositionData> spdata;
hr = spdev->Read(__uuidof(IMEDPositionData), reinterpret_cast<IUnknown
**> (&spdata));
the read function creats an instance of IMEDPositionData and returns it
STDMETHODIMP CENV520USB::Read(REFIID riid, IUnknown ** pData)
{
/*do stuff*/
hr = CoCreateInstance(__uuidof(ENV520CompatibleData), NULL,
CLSCTX_INPROC_SERVER, riid, reinterpret_cast<LPVOID *> (pData));
/*do stuff/*
return hr;
}
COM is using a different thread to call the read function with, so the
pointer returned from spdev->Read is invalid. (Sometimes COM uses the
same thread to call the read function, and everything works then.) How
do I properly marshal the interface so it works as I expect? Microsoft
uses the same method in some of their COM interfaces (pass REFIID,
IUnknown **, and the com interface creates the requested com interface,
fills with data, and returns) so I assume the method is appropriate.
I've done a lot of research, and found lots of answers for marshalling
arrays and structs, but nothing yet that deals with this. I appreciate
any help you could give me.