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

发布于 2024-07-05 15:13:40 字数 567 浏览 5 评论 0原文

我经常遇到类似的情况: 我有一堆 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 上本机运行的二进制文件)。

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

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

I'm regularly running into similar situations :
I have a bunch of COM .DLLs (no IDL files) which I need to use and invoke to be able to access some foreign (non-open, non-documented) data format.

Microsoft's Visual Studio platform has very nice capabilities to import such COM DLLs and use them in my project (Visual C++'s #import directive, or picking and adding them using Visual Basic .NET's dialogs) - and that's the vendors recommended way to use them.

I would be interested into finding a way to use those DLLs on non-microsoft development platforms. Namely, using these COM classes in C++ project compiled with MinGW or Cygwin, or even Wine's GCC port to linux (compiles C++ targeting Win32 into binary running natively on Linux).

I have got some limited success using this driver, but this isn't successful in 100% of situations (I can't use COM objects returned by some methods).

Has someone had success in similar situations ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

七堇年 2024-07-12 15:13:40

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

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

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

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

我的修补版本和补丁可作为 github 上的分支:

这是我的补丁:

Answering myself but I managed to find the perfect library for OLE/COM calling in non-Microsoft compilers : disphelper.

(it's available from sourceforge.net under a permissive BSD license).

It works both in C and C++ (and thus any other language with C bindings as well). It uses a printf/scanf-like format string syntax.
(You pass whatever you want as long as you specify it in the format string, unlike XYDispDriver which requires the arguments to exactly match whatever is specified in the type library).

I modified it a little bit to get it also compile under Linux with WineGCC (to produce native Linux elf out of Win32 code), and to handle "by ref" calls automatically (stock disthelper requires the programmer to setup his/her own VARIANT).

My patched version and patches are available as a fork on github:

And here are my patches :

陈独秀 2024-07-12 15:13:40

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

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

The problem with the Ole/Com Object Viewer packaged with Visual Studio and Windows SDKs is that it produces a broken .IDL out of the .DLL, which can't further be compiled by MIDL into a .H/.CPP pair.

Wine's own reimplementation of OleViewer is currently unstable and crashes when trying to use those libraries.

始终不够 2024-07-12 15:13:40

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

I think you should be able to use the free tool Ole/Com Object Viewer to make the header files.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文