Импортируйте файл dll в другой файл IDL - PullRequest
1 голос
/ 04 января 2012

Я работаю над проектом по разработке прокси-компонента COM для данного компонента в Visual C ++. Если «Comp» является исходным компонентом, а Proxy_Comp является прокси-компонентом, то Proxy_Comp должен иметь те же интерфейсы, что и у исходного компонента.

Я думаю, что это должно быть сделано путем импорта только "Comp.dll". Один из моих друзей сделал это успешно раньше. Но я не могу этого сделать. Может ли кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

3 голосов
/ 04 января 2012

Полагаю, вы говорите о директиве importlib в файле IDL. Требуется библиотека типов, расширение имени файла .tlb. Это двоичный файл, созданный путем запуска midl.exe для файла .idl, который содержит определения .idl в компактной форме.

DLL не является библиотекой типов. Однако в COM Automation принято встраивать библиотеку типов для COM-сервера в качестве ресурса внутри DLL. Весьма удобно хранить вместе код сервера и определения его интерфейса. Вы можете легко увидеть это в Visual Studio, использовать File + Open + File и выбрать DLL. Вы можете выбрать c: \ windows \ system32 \ shell32.dll в качестве примера.

Имя типа ресурса неизменно «TYPELIB», откройте узел, чтобы увидеть идентификатор ресурса, неизменно «1». Вы можете дважды щелкнуть по нему, чтобы посмотреть содержимое, не очень интересное, поскольку это всего лишь шестнадцатеричный дамп. Вы узнаете строки, имена интерфейсов, коклассы и их члены.

Закройте это окно и щелкните правой кнопкой мыши «1», обратите внимание на пункт «Экспорт контекстного меню». Это позволяет вам записать файл на диск, назвать его чем-то .tlb. Теперь у вас будет точная копия .tlb, которая нравится директиве importlib ().

Эта .tlb может быть декомпилирована по очереди, чтобы заново сгенерировать оригинальный файл .idl. Запустите приглашение Visual Studio. Запустите oleview.exe, Файл + Открыть Typelib и выберите .tlb. Установите фокус на правой панели, введите Ctrl + A, Ctrl + C и вставьте его в текстовый редактор. Теперь вы вернули оригинальный .idl, вы можете просто использовать директиву import .

Это имеет 100% точность, только если исходный файл .idl был чистым COM Automation и не содержал cpp_quote.

2 голосов
/ 04 января 2012

Требуются определения интерфейса из библиотеки типов (данные .tlb, встроенные в DLL).Если у вас установлены утилиты Windows SDK (возможно, с VS), запустите OLE / COM Object Viewer и "File", "View Typelib" для вашей DLL.Это должно дать вам IDL-дамп, из которого вы можете скопировать определения интерфейса из.

(Также может быть способ импортировать данные .tlb во время компиляции IDL, если это то, что вам нужно, но яя не уверен, извините.)

...