34

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

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

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

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

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

4

3 回答 3

25

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

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

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

我对其进行了一些修改,使其也可以在 Linux 下使用 WineGCC 编译(从 Win32 代码中生成本机 Linux 精灵),并自动处理“by ref”调用(股票 disthelper 需要程序员设置他/她自己的 VARIANT) .

我的补丁版本和补丁可作为 github 上的 fork 获得:

这是我的补丁:

于 2008-10-31T20:40:24.887 回答
5

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

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

于 2008-09-17T16:51:48.007 回答
0

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

于 2008-09-17T15:39:54.963 回答