Как Вы находите интерфейсы COM без typelib?

Действительно ли возможно найти все интерфейсы (классы, параметры, ect..) обычно зарегистрированный в TypeLib Объектной модели компонентов (COM) даже при том, что TypeLib абсолютно пуст? Раз так, как Вы пошли бы о выполнении этого? Я полагаю, что другой термин для этого является "Анонимным COM". Я уверен, что доступные интерфейсы существуют для этого COM, потому что у меня есть приложение, которое использует класс, который не перечислен в TypeLib.

7
задан pnuts 26 October 2015 в 03:49
поделиться

2 ответа

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

Чтобы найти реализацию IUnknown , вам понадобится по крайней мере запись кокласса в библиотеке типов.

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

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

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

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

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

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

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

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

8
ответ дан 6 December 2019 в 19:36
поделиться

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

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

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

5
ответ дан 6 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: