在非Microsoft平台上使用组件对象模型(COM)

时间:2008-09-17 15:10:00

标签: c++ com cygwin mingw wine

我经常遇到类似情况: 我有一堆COM .DLL(没有IDL文件)我需要使用和调用才能访问一些外来的(非开放的,未记录的)数据格式。

Microsoft的Visual Studio平台具有非常好的功能来导入这样的COM DLL并在我的项目中使用它们(Visual C ++的#import指令,或使用Visual Basic .NET的对话框挑选和添加它们) - 这是供应商推荐的使用方法它们。

我有兴趣找到一种在非Microsoft开发平台上使用这些DLL的方法。也就是说,在使用MinGW或Cygwin编译的C ++项目中使用这些COM类,甚至将Wine的GCC端口编译为linux(将C ++目标编译为在Linux上本机运行的二进制文件)。

使用this驱动程序取得了一些成功,但在100%的情况下这不成功(我不能使用某些方法返回的COM对象)。

有人在类似的情况下取得了成功吗?

3 个答案:

答案 0 :(得分:22)

回答自己,但我设法在非Microsoft编译器中找到了用于OLE / COM调用的完美库:disphelper

(根据许可的BSD许可证,可从sourceforge.net获得)。

它既适用于C和C ++(也适用于任何其他带有C绑定的语言)。它使用类似printf / scanf的format string syntax (只要你在格式字符串中指定它就可以传递任何你想要的东西,这与XYDispDriver不同,https://github.com/DrYak/disphelper要求参数完全匹配类型库中指定的内容。)

我对它进行了一些修改,以便在Linux下使用WineGCC进行编译(从Win32代码生成本机Linux精灵),并自动处理“by ref”调用(库存分散需要程序员设置他/她拥有VARIANT)。

我的补丁版本和补丁在github上以fork形式提供:

以下是我的补丁:

答案 1 :(得分:5)

与Visual Studio和Windows SDK一起打包的Ole / Com对象查看器的问题在于,它会从.DLL中生成一个损坏的.IDL,MIDL无法进一步将其编译为.H / .CPP对

Wine自己重新实现的OleViewer目前还不稳定,在尝试使用这些库时会崩溃。

答案 2 :(得分:0)

我认为您应该能够使用免费工具Ole / Com Object Viewer来制作头文件。