gpt4 book ai didi

c++ - COM 使用 CoMarshalInterThreadInterfaceInStream 编码接口(interface)

转载 作者:搜寻专家 更新时间:2023-10-31 01:30:23 25 4
gpt4 key购买 nike

我有一个在 C++ 中注册函数和接口(interface)的方法,我正在使用 CoMarshalInterThreadInterfaceInStream 将接口(interface)指针编码到另一个线程中的方法。

RegisterFunction 中:

HRESULT hr = CoMarshalInterThreadInterfaceInStream(IID_Function, function, &stream);

GetFunction 中释放它:

HRESULT hr = CoGetInterfaceAndReleaseStream(stream, IID_Function, reinterpret_cast<void**>(&function));

由于我将多次调用 GetFunctionCoGetInterfaceAndReleaseStream 只释放一次流,我该如何保存流以再次使用它?


我尝试使用 IGlobalInterfaceTable,但无法正常工作。

我在 RegisterFunction 中成功注册了接口(interface):

DWORD dwCookie = 0;
int a = 0;
if (pGIT == NULL) {
HRESULT hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable,
NULL,
CLSCTX_INPROC_SERVER,
IID_IGlobalInterfaceTable,
(void **)&pGIT);
if (hr != S_OK) {
throw _com_error(hr);
}
}

if (dwCookie == 0) {
HRESULT hr = pGIT->RegisterInterfaceInGlobal(function, IID_Function, &dwCookie);
if (hr != S_OK) {
throw _com_error(hr);
}
}

但是当我试图在 GetFunction 中检索它时:

   IGlobalInterfaceTable* GIT = NULL;
if (GIT == NULL) {
hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable,
NULL,
CLSCTX_INPROC_SERVER,
IID_IGlobalInterfaceTable,
(void **)&GIT);
if (FAILED(hr)) {
exit(0);
}
}

hr = pGIT->GetInterfaceFromGlobal(dwCookie, IID_Function, (void**)&function);
if (FAILED(hr)) {
exit(0);
}

当我尝试 RegisterInterfaceInGlobal 时,我收到一个 HR 错误 invalidArg(尽管它使用与 CoMarshalInterThreadInterfaceInStream 相同的参数,除了 cookie)

最佳答案

正如 SoronelHaetir 所说,您不能使用 CoMarshalInterThreadInterfaceInStream 执行此操作。它只能(取消)编码一个接口(interface)一次。

看看使用IGlobalInterfaceTable反而。您可以在表中注册您的 COM 对象一次,然后在任何线程/单元中多次从表中检索该对象,直到您从表中撤销该对象。

关于c++ - COM 使用 CoMarshalInterThreadInterfaceInStream 编码接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48065669/

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