COM使用CoMarshalInterThreadInterfaceInStream来编组接口

时间:2018-01-02 18:01:17

标签: c++ com

我有一个在C ++中注册函数和接口的方法,我使用CoMarshalInterThreadInterfaceInStream来编组一个指向另一个线程中的方法的接口指针。

RegisterFunction

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

GetFunction

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

由于我将多次调用GetFunctionCoGetInterfaceAndReleaseStream仅发布一次流,如何保存流以再次使用它?

我尝试使用IGlobalInterfaceTable,但我无法让它发挥作用。

我在RegisterFunction

中成功注册了Inteface
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)

2 个答案:

答案 0 :(得分:3)

正如SoronelHaetir所说,你不能用CoMarshalInterThreadInterfaceInStream做到这一点。它只能(un)编组一次接口。

请改用IGlobalInterfaceTable。您可以在表中注册COM对象一次,然后根据需要从任何线程/公寓中的表中检索对象,直到从表中撤消对象为止。

答案 1 :(得分:0)

你不能用CoMarshalInterThreadInterfaceInStream做它,它只是一次提取的接口指针的便捷方法。

而是使用CoMarshalInterface / CoUnmarshalInterface并使用使用ShCreateMemStream创建的流。