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

DrY*_*Yak 31 c++ com cygwin wine mingw

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

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

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

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

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

DrY*_*Yak 23

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

(它可以在许可的BSD许可下从sourceforge.net获得).

它既适用于C和C++(也适用于任何其他带有C绑定的语言).它使用类似printf/scanf的格式字符串语法.
(只要您在格式字符串中指定它,就可以传递任何所需内容,这与XYDispDriver不同,后者要求参数与类型库中指定的内容完全匹配).

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

我的修补版本和补丁在github上作为fork提供:

以下是我的补丁:

  • 只是想知道你的补丁是否可以在某处下载? (3认同)

DrY*_*Yak 5

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

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