我经常遇到类似的情况:我有一堆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对象).
有人在类似情况下取得了成功吗?
回答自己,但我设法在非Microsoft编译器中找到完美的OLE/COM调用库:disphelper.
(它可以在许可的BSD许可下从sourceforge.net获得).
它既适用于C和C++(也适用于任何其他带有C绑定的语言).它使用类似printf/scanf的格式字符串语法.
(只要您在格式字符串中指定它,就可以传递任何所需内容,这与XYDispDriver不同,后者要求参数与类型库中指定的内容完全匹配).
我对它进行了一些修改,以便在Linux下使用WineGCC进行编译(用Win32代码生成本机Linux精灵),并自动处理"by ref"调用(库存disthelper需要程序员设置他/她自己的VARIANT) .
我的修补版本和补丁在github上作为fork提供:
https://github.com/DrYak/disphelper
以下是我的补丁:
单一来源的补丁
拆分源补丁
与Visual Studio和Windows SDK打包在一起的Ole/Com对象查看器的问题在于,它会从.DLL中生成一个损坏的.IDL,MIDL无法将其进一步编译为.H/.CPP对.
Wine自己重新实现OleViewer目前不稳定,并在尝试使用这些库时崩溃.