Если библиотека типов пуста, то вы не сможете найти информацию о типах в библиотеке 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-интерфейсы, которые они определили в частном порядке, и работать оттуда.
Единственная причина, по которой я могу придумать что-то подобное, - это форма запутывания и / или решения проблем конфиденциальности / безопасности, позволяющая только клиентам, которых разрешает производитель сервера, вызывать его.
Это не поможет вам, но может объяснить, почему вы видите библиотеку типов без информации и в то же время видите, что другие клиенты используют библиотеку.