gpt4 book ai didi

c++ - CoMarshalInterThreadInterfaceInStream 为 Visual Basic 6 类返回 0x800A0062

转载 作者:行者123 更新时间:2023-11-28 03:37:31 25 4
gpt4 key购买 nike

我有基于 C++/ATL 的 COM 对象,其方法接受接口(interface)以允许回调:

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 接口(interface)。唯一的方法“CallMe”期望客户端应该传递“事件”接口(interface)以允许来自工作线程的回调。 “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对象调用代码

Dim obj As Object
Set obj = CreateObject("C++ Com Object ProgID")

Dim callback As New MyCallbackClass

obj.CallMe "123", callback

一切看起来都很好,但突然间 MyCallback 类实例无法编码到流中。同时,我可以使用来自同一线程的 C++ 实现的“事件”接口(interface)指针。

CoMarshalInterThreadInterfaceInStream 失败并出现未记录的错误:0x800A0062

我在这里做错了什么?

提前致谢!

最佳答案

您不能编码私有(private)类,标准编码需要类型库来跨线程传输参数。

您可以在 VB6 中的 ActiveX DLL 项目上将 MyCallbackClass 实现为公共(public)(多用途或公共(public)不可创建)类,以便编码工作或更好地在 ATL 中实现回调代理组件。

您的 CallMe 将在传递原始 VB6 接口(interface)的调用线程上创建代理,然后将代理对象的 IAsyncEvents 接口(interface)编码到工作线程。

关于c++ - CoMarshalInterThreadInterfaceInStream 为 Visual Basic 6 类返回 0x800A0062,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10411251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com