2012-05-02 116 views
0

我有方法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

我錯在這裏做什麼?

預先感謝您!

+0

Google「vb6 runtime error 98」。代碼很奇怪,你編組指針和*然後*開始一個線程?錯誤的方式。確保vb6回調總是封送回它自己的主線程,它不支持任何類型的線程。 –

+0

@Hans,我應該在線程開始之前元帥,否則我應該在線程中解開什麼?我想這沒關係,如下所示:http://msdn.microsoft.com/en-us/library/windows/desktop/ms693316(v=vs.85).aspx –

+0

哦,沒錯,沒錯。我更喜歡IGlobalInterfaceTable。那麼,運行時錯誤98就是你所得到的。不知道「私人對象」可能意味着什麼。 –

回答

2

你不能編組私有類,標準編組需要一個typelib來跨參數傳輸參數。

您可以實現MyCallbackClass作爲公共上的ActiveX DLL項目在VB6(多使用或公開不可創建的)類編組工作或更好地在您的ATL組件的回調代理。

您的CallMe將在調用線程上創建代理,然後通過原始VB6接口將代理對象的接口傳遞給worker-thread。

+0

謝謝!當我把回調對象(MyCallBackClass)放到另一個項目(ActiveX DLL)時,事情就會變好。我記得ATL項目是用標記「允許合併代理/存根代碼」創建的。我不知道現在在哪裏尋找代理存根代碼,但它看起來像項目中沒有代理存根代碼。 –