我有一个基于C ++ / ATL的COM对象,该对象带有接受接口以允许回调的方法:
MIDL
[object, uuid(...), dual, nonextensible, oleautomation, pointer_default(unique)]
interface IAsyncEvents : IDispatch{
[id(1)]
HRESULT OnProgress([in]BSTR message);
};
[object, uuid(...), dual, nonextensible, pointer_default(unique)]
interface IAsyncWorker : IDispatch{
HRESULT CallMe(BSTR message, IAsyncEvents* events);
};
COM对象实现IAsyncWorker接口。唯一的方法“ CallMe”期望客户端应传递“事件”接口,以允许从工作线程进行回调。 “ CallMe”实现如下所示:
STDMETHOD(CallMe)(BSTR message, IAsyncEvents* events)
{
IStream *pStm = NULL;
HRESULT hRes = CoMarshalInterThreadInterfaceInStream(IID_IAsyncEvents, events, &pStm);
if (hRes != S_OK)
{
ATL::CAtlString str;
str.Format(_T("Failed CoMarshallInterThread... %i"), hRes);
MessageBox(0, str, NULL, MB_TOPMOST);
return E_FAIL;
}
m_hThread = ::CreateThread(NULL, 0, WorkerFunc, (LPVOID)pStm, 0, &m_dwThreadId);
return ::GetLastError();
}
我尝试像这样从Visual Basic调用“ CallMe”:
MyCallBack类别
Option Explicit
Implements AsyncDllLib.IAsyncEvents
Public Sub IAsyncEvents_OnProgress(ByVal message As String)
MsgBox (message)
End Sub
VB6 com-object调用代码
Dim obj As Object
Set obj = CreateObject("C++ Com Object ProgID")
Dim callback As New MyCallbackClass
obj.CallMe "123", callback
一切看起来都很好,但是突然MyCallback类实例无法编组到流中。同时,我可以在同一线程中使用C ++实现中的“事件”接口指针。
CoMarshalInterThreadInterfaceInStream失败,出现未记录的错误:0x800A0062
我在这里做错了什么?
先感谢您!
最佳答案
您无法封送私有类,标准封送处理需要typelib才能跨线程传输参数。
您可以在VB6中的ActiveX DLL项目上将MyCallbackClass
作为公共(多用途或不可创建的公共类)实现,以使封送工作或更好地在ATL组件中实现回调代理。
您的CallMe
将在传递原始VB6接口的调用线程上创建代理,然后将代理对象的IAsyncEvents
接口编组到工作线程。
关于c++ - CoMarshalInterThreadInterfaceInStream为Visual Basic 6类返回0x800A0062,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10411251/