c++ - Reg-Free 进程外 COM 服务器事件

标签 c++ com registration-free-com

我们正在尝试将进程内 COM 对象更改为进程外 COM 对象。新进程只是将 Dispatch 传递给以前使用的 COM 对象,因此我们可以选择返回到进程内对象。 这工作正常,但我们遇到了有关事件的问题。进程外服务器拦截先前使用的 COM 对象的事件,并将这些事件传递给自己的事件接口(interface),该接口(interface)也在工作。但问题是,当进程外服务器未在 Windows 注册表中注册时,客户端无法使用 DispEventAdvise 连接到此事件接口(interface)。

服务器 IDL 如下所示:

[
  object,
  uuid(www),
  dual,
  oleautomation,
  nonextensible,
  helpstring("IControl Interface"),
  pointer_default(unique)
]
interface IControl : IDispatch
{
  [id(1)] HRESULT CreateDispatch([out] IDispatch** ppDispatch);
};

[
  uuid(xxx),
  version(1.0),
  helpstring("Control Type Library")
]
library ControlLib
{
  importlib("stdole2.tlb");
  [
    uuid(yyy),
    helpstring("IControlEvents Interface"),
    nonextensible
  ]
  interface IControlEvents : IUnknown
  {
    [id(1)] HRESULT MyEvent(void);
  };

  [
    uuid(zzz),
    helpstring("_IControlEvents Interface")
  ]
  dispinterface _IControlEvents
  {
    interface IControlEvents;
  };

  coclass Control
  {
    [default] interface IControl;
    [default, source] dispinterface _IControlEvents;
  };
};

我们将control_i.c、control_p.c 和dlldata.c 添加到客户端和服务器。并且都执行以下步骤来注册代理/ stub 。

PrxDllGetClassObject(IID_IControl, IID_IUnknown, (void **)&punk);
CoRegisterClassObject(IID_IControl, punk, CLSCTX_INPROC_SERVER, REGCLS_SINGLEUSE, &dwRCO);
CoRegisterPSClsid(IID_IControl, IID_IControl);
CoRegisterPSClsid(IID_IControlEvents, IID_IControl);
CoRegisterPSClsid(DIID__IControlEvents, IID_IControl);

这适用于使用 CoCreateInstance 创建的控件,但不适用于事件。 DispEventAdvise 不断返回 CONNECT_E_CANNOTCONNECT,导致接收器上 DIID__IControlEvents 的 QueryInterface 返回 E_NOINTERFACE。

我们真的需要在不在注册表中注册控件的情况下让它工作。我们还尝试使用 list 文件和单独的代理/ stub DLL 来注册它,但没有成功。


最佳答案

我们最终只在注册表中注册了调度事件接口(interface),以正确注册 stub 类。它现在已“注册”但没有任何文件引用。所以我们仍然可以并排安装。

关于c++ - Reg-Free 进程外 COM 服务器事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29163482/

相关文章:

c++ - 为什么我可以在没有调用 CoInitializeEx 的情况下调用 StringFromCLSID?

c++ - 我们如何在不注册 dll 的情况下对我们的 c++ COM 代码进行单元测试?

c# - .NET Framework (v 4.0) 从 Win32 C++ 应用程序免费调用 COM 注册

c++ - C/C++源代码可视化?

c++ - 如果我写一个字符串,fprintf 会将 '\0' 写入文件吗?

c++ - 将字符串转换为 double ,而字符串有 N 位小数,C++

c++ - 使用 void 函数在 main 函数中设置变量值

delphi - 无法创建 OpenOffice 桌面实例(com 对象)

Delphi 2009 COM/ActiveX 类型库支持稳定性