在非 Microsoft 平台上使用组件对象模型 (COM)
题
我经常遇到类似的情况:我有一堆 COM .DLL(没有 IDL 文件),我需要使用和调用它们才能访问一些外部(非开放、非文档化)数据格式。
Microsoft 的 Visual Studio 平台具有非常好的功能来导入此类 COM DLL 并在我的项目中使用它们(Visual C++ 的 #import 指令,或使用 Visual Basic .NET 的对话框选择并添加它们) - 这是供应商推荐的使用它们的方式。
我有兴趣找到一种在非微软开发平台上使用这些 DLL 的方法。也就是说,在使用 MinGW 或 Cygwin 编译的 C++ 项目中使用这些 COM 类,甚至将 Wine 的 GCC 移植到 Linux(将针对 Win32 的 C++ 编译成在 Linux 上本机运行的二进制文件)。
我使用它取得了一些有限的成功 这 驱动程序,但这在 100% 的情况下并不成功(我无法使用某些方法返回的 COM 对象)。
有人在类似情况下取得过成功吗?
解决方案
回答自己,但我设法找到了 完美的 在非 Microsoft 编译器中调用 OLE/COM 的库: 驱散者.
(它可以从 来源网 根据宽松的 BSD 许可证)。
它适用于 C 和 C++(因此也适用于具有 C 绑定的任何其他语言)。它使用类似 printf/scanf 的 格式化字符串语法.
(只要在格式字符串中指定,您就可以传递任何您想要的内容,这与 XY显示驱动程序 这要求参数与类型库中指定的内容完全匹配)。
我对其进行了一些修改,使其也可以在 Linux 下使用 WineGCC 进行编译(以从 Win32 代码生成本机 Linux elf),并自动处理“by ref”调用(库存 disthelper 要求程序员设置他/她自己的 VARIANT) 。
我的补丁版本和补丁可以作为 github 上的分支获得:
这是我的补丁:
其他提示
与 Visual Studio 和 Windows SDK 一起打包的 Ole/Com 对象查看器的问题在于,它会从 .DLL 中生成损坏的 .IDL,而 MIDL 无法将其进一步编译为 .H/.CPP 对。
Wine 自己的 OleViewer 重新实现目前不稳定,并且在尝试使用这些库时会崩溃。
我认为你应该能够使用免费工具 Ole/Com Object Viewer 来制作头文件。