QueryInterface COM-сервера вне процесса на интерфейсе, импортированном из TLB - PullRequest
2 голосов
/ 01 декабря 2010

Я определяю свои интерфейсы в файле A.idl, который я компилирую в A.tlb

В проекте ATL VS2005 "B" я использую importlib (A.tlb) в B.idl и #import«A.tlb» в stdafx.h и реализовать интерфейс IA из A.tlb в классе ATL COM.В проекте выводятся файлы B.dll и B.tlb

. Я добавляю B.tlb к ссылкам приложения C #, а в коде я создаю экземпляр COM-объекта.

Создание экземпляра работает без проблем, если я использую либо

Type.GetTypeFromCLSID(); Activator.CreateInstance(...);

или

[DllImport("ole32.dll", ...)] CoCreateInstance(...)

Оба работают нормально, объект создает и Я могу привести его кИнтерфейс IA определен в A.tlb (фактически RCW, сгенерированный из tlb) и вызывает его методы.По-прежнему никаких проблем.

Затем я использую OLEView, чтобы активировать COM-объект, используя суррогат DllHost.exe по умолчанию.

Создание экземпляра COM-объекта в суррогате (параметр CLSCTX_LOCAL_SERVER в CoCreateInstance) все еще без проблем, но , когда я пытаюсь привести объект к интерфейсу IA, определенному в A.tlb, я получаю E_NOINTERFACE и сообщение о том, что QueryInterface не выполнен, потому что "такой интерфейс не поддерживается".

Пожалуйста, помогите.Что может быть не так?Если вам понадобится дополнительная информация, я постараюсь предоставить как можно больше.

1 Ответ

2 голосов
/ 01 декабря 2010

Вам необходимо собрать и зарегистрировать прокси / заглушку DLL. Требуется для маршалинга интерфейсов через границы процесса. Я не могу найти для него отличную страницу MSDN, но здесь упоминается .

...