Использование объектной модели компонентов (COM) на платформах сторонних производителей.
Вопрос
Я регулярно сталкиваюсь с подобными ситуациями:У меня есть несколько COM .DLL (без IDL-файлов), которые мне нужно использовать и вызывать, чтобы иметь доступ к некоторому внешнему (неоткрытому, недокументированному) формату данных.
Платформа Microsoft Visual Studio имеет очень хорошие возможности для импорта таких COM-библиотек DLL и использования их в моем проекте (директива Visual C++ #import или выбор и добавление их с помощью диалоговых окон Visual Basic .NET) - и это рекомендуемый поставщиками способ их использования.
Мне было бы интересно найти способ использовать эти DLL на платформах разработки сторонних разработчиков.А именно, использование этих COM-классов в проекте C++, скомпилированном с помощью MinGW или Cygwin, или даже порта Wine GCC для Linux (компилирует C++, ориентированный на Win32, в двоичный файл, работающий в исходном виде в Linux).
У меня есть ограниченный успех, используя этот драйвер, но в 100% случаев это не удается (я не могу использовать COM-объекты, возвращаемые некоторыми методами).
Был ли у кого-то успех в подобных ситуациях?
Решение
Отвечаю сам, но мне удалось найти идеальный библиотека для вызовов OLE/COM в компиляторах сторонних производителей: дисхелпер.
(он доступен на sourceforge.net под разрешительной лицензией BSD).
Он работает как на C, так и на C++ (и, следовательно, на любом другом языке с привязками C).Он использует printf/scanf-подобный синтаксис строки формата.
(Вы передаете все, что хотите, если указываете это в строке формата, в отличие от XYDispDriver что требует, чтобы аргументы точно соответствовали тому, что указано в библиотеке типов).
Я немного модифицировал его, чтобы он также компилировался под Linux с WineGCC (чтобы создавать собственный Linux elf из кода Win32) и автоматически обрабатывать вызовы «по ссылке» (стандартный disthelper требует, чтобы программист настроил свой собственный ВАРИАНТ) .
Моя исправленная версия и патчи доступны в виде форка на github:
А вот мои патчи:
Другие советы
Проблема со средством просмотра объектов Ole/Com, входящим в состав Visual Studio и Windows SDK, заключается в том, что оно создает неработающий .IDL из .DLL, который в дальнейшем не может быть скомпилирован MIDL в пару .H/.CPP.
Собственная реализация OleViewer от Wine в настоящее время нестабильна и дает сбой при попытке использовать эти библиотеки.
Я думаю, вы сможете использовать бесплатный инструмент Ole/Com Object Viewer для создания файлов заголовков.