我正在寻找在不使用 COM 的情况下在 perl 代码中调用 C++ dll 的示例。我可以使用 win32::API 吗?该库是在 Visual Studio 2010 中编写的。
2 回答
你可以
- 使用XS创建基于 C 的模块。
- 使用Inline::C创建一个 C 函数。
- 使用Win32::API::More。(如果 DLL 不使用 stdcall 调用约定,则需要使用一个封装 DLL。)
使用 Win32::API 调用 C++ 方法或构造函数,可能不会。
Win32::API 不支持 32 位窗口上的 C++ 调用约定 (__thiscall)。在 64 位 Windows 上,它可以工作,因为在 Win64 上只有 1 个调用约定。C++ 最大的问题是 ABI 兼容性和名称修改。Win32::API 对处理名称修改没有帮助。您必须找到每个 C++ 函数(这是 C++ 中的一个方法)的错位名称,并将其提供给 Win32::API。Win32::API 可以与任意 C 函数指针一起使用,因此一个充满 C 函数的 vtable(如在 COM 中)在 Win32::API 中工作正常,有关此示例的旧示例,请参见http://perlmonks.org/? node_id=969555. 此外,您还必须了解汇编代码级别的 C++ 对象和 C++ 标准库。Win32::API 不支持 32 位 C++ 调用约定。这是第一个路障。我(Win32::API 的作者之一)可能有一天会在 Win32::API 中实现 __thiscall。
发明 COM/OLE 是为了不必处理不同 C++ 编译器之间的 ABI 问题。Win32::API 可以在 COM 对象上正常工作,假设您知道 COM 在纯 C 中的工作方式。要了解 COM 在纯 C 中的工作方式,我建议阅读此系列文章http://www.codeproject.com/Articles/13601 /COM-in-plain-C。Win32::OLE 和 Win32::API 可以像 perlmonks 示例中所示的那样被破解。