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 ответ
Мы закончили тем, что зарегистрировали только интерфейс события отправки в реестре, чтобы класс заглушки был зарегистрирован правильно. Теперь он "зарегистрирован", но без ссылок на файлы. Таким образом, у нас все еще могут быть параллельные установки.