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

时间:2020-03-05 18:59:07  来源:igfitidea点击:

我经常遇到类似情况:
我有一堆COM .DLL(没有IDL文件),我需要使用它们并调用它们才能访问某些外部(未公开,未记录文档)数据格式。

Microsoft的Visual Studio平台具有很好的功能,可以导入此类COM DLL并在我的项目中使用它们(Visual C ++的#import指令,或者使用Visual Basic .NET的对话框进行选择和添加),这是供应商推荐的使用它们的方式。

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

使用此驱动程序我获得了一些有限的成功,但是在100%的情况下却没有成功(我无法使用某些方法返回的COM对象)。

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

解决方案

回答

我认为我们应该可以使用免费工具Ole / Com Object Viewer制作头文件。

回答

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

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

回答

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

(可以在宽松的BSD许可下从sourceforge.net获得)。

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

我对其进行了一些修改,以使其也可以在Linux上使用WineGCC进行编译(从Win32代码生成本地Linux elf),并自动处理"按引用"调用(股票disthelper要求程序员设置自己的VARIANT) 。

我的补丁版本和补丁可以在github上以fork的形式获得:

  • https://github.com/DrYak/disphelper

这是我的补丁:

  • 单一来源补丁
  • 拆分源补丁