我有一个在C ++中注册函数和接口的方法,我使用CoMarshalInterThreadInterfaceInStream
来编组一个指向另一个线程中的方法的接口指针。
在RegisterFunction
:
HRESULT hr = CoMarshalInterThreadInterfaceInStream(IID_Function, function, &stream);
在GetFunction
:
HRESULT hr = CoGetInterfaceAndReleaseStream(stream, IID_Function, reinterpret_cast<void**>(&function));
由于我将多次调用GetFunction
而CoGetInterfaceAndReleaseStream
仅发布一次流,如何保存流以再次使用它?
我尝试使用IGlobalInterfaceTable
,但我无法让它发挥作用。
我在RegisterFunction
:
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时,我得到了invalidArg的HR错误(即使它使用与CoMarshalInterThreadInterfaceInStream相同的参数,除了cookie)
答案 0 :(得分:3)
正如SoronelHaetir所说,你不能用CoMarshalInterThreadInterfaceInStream
做到这一点。它只能(un)编组一次接口。
请改用IGlobalInterfaceTable
。您可以在表中注册COM对象一次,然后根据需要从任何线程/公寓中的表中检索对象,直到从表中撤消对象为止。
答案 1 :(得分:0)
你不能用CoMarshalInterThreadInterfaceInStream做它,它只是一次提取的接口指针的便捷方法。
而是使用CoMarshalInterface / CoUnmarshalInterface并使用使用ShCreateMemStream创建的流。