Reg-Free внепроцессные события COM-сервера

Мы пытаемся изменить COM-объект вне процесса на COM-объект вне процесса. Новый процесс просто передает Dispatch ранее использовавшемуся COM-объекту, поэтому мы можем при желании вернуться к объекту in-proc. Это работает нормально, но мы сталкиваемся с проблемами, связанными с событиями. Сервер вне процесса перехватывает события ранее использовавшегося COM-объекта и передает их в собственный интерфейс событий, который также работает. Но проблема в том, что клиент не может подключиться к этому интерфейсу событий с помощью DispEventAdvise, когда внепроцессный сервер не зарегистрирован в реестре Windows.

Сервер 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, поскольку QueryInterface для DIID__IControlEvents в приемнике возвращает E_NOINTERFACE.

Нам действительно нужно, чтобы это работало без регистрации элемента управления в реестре. Мы также пытались зарегистрировать его, используя файлы манифеста, а также отдельные DLL-файлы прокси / заглушки, но безуспешно.


1 ответ

Решение

Мы закончили тем, что зарегистрировали только интерфейс события отправки в реестре, чтобы класс заглушки был зарегистрирован правильно. Теперь он "зарегистрирован", но без ссылок на файлы. Таким образом, у нас все еще могут быть параллельные установки.

Другие вопросы по тегам