Как вы находите интерфейсы COM без typelib? - PullRequest
7 голосов
/ 02 марта 2010

Можно ли найти все интерфейсы (классы, параметры и т. Д.), Обычно зарегистрированные в TypeLib компонентной объектной модели (COM), даже если TypeLib полностью пуст? Если так, как бы вы поступили? Я считаю, что другой термин для этого - «Анонимный СОМ». Я уверен, что доступные интерфейсы существуют для этого COM, потому что у меня есть приложение, которое использует класс, который не указан в TypeLib.

Ответы [ 2 ]

8 голосов
/ 02 марта 2010

Если библиотека типов пуста, то вы не сможете найти информацию о типах в библиотеке COM.

Вам нужно как минимум запись в классном классе в typelib, чтобы найти реализацию IUnknown .

Если у вас это есть, вы можете создать экземпляры класса и затем вызвать QueryInterface для IUnknown для реализации IDispatch (если она существует).

Если интерфейс IDispatch существует, вы можете вызвать GetTypeInfo , чтобы получить информацию об интерфейсах, которые реализованы.

Если вам нужно сделать поздние звонки в IDispatch, вам нужно будет вызвать метод Invoke .

Обратите внимание, вы упомянули библиотеку типов, но для внутрипроцессных COM-серверов является обычной практикой встраивать библиотеку типов в dll, которая является реализацией типов, представленных в библиотеке. Вы уверены, что не проверяли это? Или вы уверены, что у вас есть библиотека типов, и она действительно пуста?

Если тип lib действительно пустой и dll его не содержит, вполне возможно, что тип lib был "private" в том смысле, что другие клиенты были скомпилированы против него. COM не требует тип-lib во время выполнения обязательно. Шаблон для представления интерфейса IClassFactory реализаций заключается в экспорте стандартной функции DLL с известной сигнатурой.

Можно легко вызвать LoadLibrary , затем вызвать GetProcAddress и привести результат к IClassFactory. Оттуда они будут использовать известные им GUID и IID (не из библиотеки типов), а также COM-интерфейсы, которые они определили в частном порядке, и работать оттуда.

Единственная причина, по которой я могу придумать что-то подобное, - это форма запутывания и / или решения проблем конфиденциальности / безопасности, позволяющая только клиентам, которых разрешает производитель сервера, вызывать его.

Это не поможет вам, но может объяснить, почему вы видите библиотеку типов без информации и в то же время видите, что другие клиенты используют библиотеку.

5 голосов
/ 02 марта 2010

Неприменение библиотеки типов в программировании COM довольно распространено. Любой язык сценариев делает это, он использует IDispatch для обнаружения поддерживаемых методов и свойств во время выполнения. IDispatch :: GetIDsOfNames () или IDispatch :: GetTypeInfo () переводят этот мяч в движение. Это называется поздним связыванием. Это медленно, но это не имеет значения на языке сценариев.

Другой стандартный способ - через заголовочные файлы, сгенерированные MIDL из файла .idl, который описывает интерфейсы и коклассы. Многие из них вы найдете в каталоге включения Windows SDK, например, в mshtml.h. Но это подходит только для неуправляемого кода C / C ++.

Использование COM без библиотеки типов на управляемом языке, таком как C #, сложно, но не невозможно. VB.NET - лучший язык, он поддерживает позднюю привязку из коробки. C # станет лучше, когда выйдет версия 4.0, у него есть новое "динамическое" ключевое слово.

...