我经常遇到类似情况: 我有一堆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对象)。
有人在类似的情况下取得了成功吗?
答案 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形式提供:
以下是我的补丁:
{{3}}
答案 1 :(得分:5)
与Visual Studio和Windows SDK一起打包的Ole / Com对象查看器的问题在于,它会从.DLL中生成一个损坏的.IDL,MIDL无法进一步将其编译为.H / .CPP对
Wine自己重新实现的OleViewer目前还不稳定,在尝试使用这些库时会崩溃。
答案 2 :(得分:0)
我认为您应该能够使用免费工具Ole / Com Object Viewer来制作头文件。