我有方法C++ /基於ATL-COM對象接受接口,以允許回調:CoMarshalInterThreadInterfaceInStream返回0x800A0062的Visual Basic 6類
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();
}
而且我打電話 「的CallMe」 從Visual Basic這樣的:
myCallBack函數類
Option Explicit
Implements AsyncDllLib.IAsyncEvents
Public Sub IAsyncEvents_OnProgress(ByVal message As String)
MsgBox (message)
End Sub
VB6 COM對象來電代碼
Dim obj As Object
Set obj = CreateObject("C++ Com Object ProgID")
Dim callback As New MyCallbackClass
obj.CallMe "123", callback
一切看起來都不錯,但突然間MyCallback類實例無法編組到流中。同時,我可以使用來自同一線程的C++實現中的「事件」接口指針。
CoMarshalInterThreadInterfaceInStream失敗記錄的錯誤:0x800A0062
我錯在這裏做什麼?
預先感謝您!
Google「vb6 runtime error 98」。代碼很奇怪,你編組指針和*然後*開始一個線程?錯誤的方式。確保vb6回調總是封送回它自己的主線程,它不支持任何類型的線程。 –
@Hans,我應該在線程開始之前元帥,否則我應該在線程中解開什麼?我想這沒關係,如下所示:http://msdn.microsoft.com/en-us/library/windows/desktop/ms693316(v=vs.85).aspx –
哦,沒錯,沒錯。我更喜歡IGlobalInterfaceTable。那麼,運行時錯誤98就是你所得到的。不知道「私人對象」可能意味着什麼。 –