簡體   English   中英

免注冊的進程外COM服務器事件

[英]Reg-Free Out-of-process COM server events

我們正在嘗試將過程中的COM對象更改為過程外的COM對象。 新過程只是將Dispatch傳遞給以前使用的COM對象,因此我們可以選擇返回到進程內對象。 一切正常,但我們遇到有關事件的問題。 進程外服務器截獲先前使用的COM對象的事件,並將這些事件傳遞到自己的事件接口,該接口也可以工作。 但是問題是,當未在Windows注冊表中注冊進程外服務器時,客戶端無法使用DispEventAdvise連接到此事件接口。

服務器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。 並都執行以下步驟來注冊代理/存根。

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。

我們確實需要在不將控件注冊到注冊表中的情況下使它起作用。 我們還嘗試使用清單文件以及單獨的代理/存根DLL進行注冊,但沒有成功。


我們最終只在注冊表中注冊了調度事件接口,以使存根類正確注冊。 現在已“注冊”,但沒有任何文件引用。 因此,我們仍然可以進行並行安裝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM