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