Re: Маршалинг и typelib
От: Jolly Roger  
Дата: 07.09.10 12:14
Оценка: 12 (4)
Здравствуйте, Andrey.Katkov, Вы писали:

Надеюсь, про функцию RegisterTypeLibForUser Вы знаете?

Если это по каким-то причинам не подходит, то маршалинг на основе библиотеки типов без регистрации самой библиотеки обеспечить несложно, но это потребует использования недокументированного API (оно, кстати упомянуто по приведённой Вами ссылке, это функции CreateProxyFromTypeInfo и CreateStubFromTypeInfo). Попробую расписать поэтапно.

Сначала пишите фабрику Proxy/Stub, реализующую интерфейс IPSFactoryBuffer, ну и IUnknown, разумеется . Далее регистрируете её как объект класса, обычным образом, через CoRegisterClassObject с флагами CLSCTX_INPROC_SERVER и REGCLS_MULTIPLEUSE, это важно. Затем регистрируете её-же как фабрику Proxy/Stub вызовом CoRegisterPSClsid. Ну и теперь подсистема COM будет вызывать эту фабрику для создания Proxy и Stub, а Вы в реализации методов IPSFactoryBuffer просто вызываете вышеупомянутые функции.

Эта схема работает. Я, например, создавал один экземпляр фабрики на экземпляр библиотеки, в качестве CLSID использовал IID интерфейса, а в IPSFactoryBuffer.CreateProxy и IPSFactoryBuffer.CreateStub уже непосредственно запрашивал ITypeInfo преред вызовом CreateProxyFromTypeInfo и CreateStubFromTypeInfo соответственно.

PS Дополнительный бонус Так как ITypeInfo можно собрать прямо в рантайм, то можно вообще обойтись без библиотеки типов.
"Нормальные герои всегда идут в обход!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.