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