如何在不使用com的情况下调用perl中的C++dll

How can I call a C++ dll in perl without using com?

本文关键字:调用 情况下 perl 中的 C++dll com      更新时间:2023-10-16

我正在寻找在不使用COM的情况下在perl代码中调用C++dll的示例。我可以使用win32::API吗?该库是在visualstudio 2010中编写的。

您可以

  • 使用XS创建一个基于C的模块
  • 使用Inline::C创建一个C函数
  • 使用Win32::API::更多。(如果DLL不使用stdcall调用约定,则需要使用使用stdcall的约定来包装DLL。)

使用Win32::API调用C++方法或构造函数,可能不是。

Win32::API不支持32位窗口上的C++调用约定(__thiscall)。在64位Windows上,它可以工作,因为在Win64上只有一个调用约定。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中实现__thicall。

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示例中所示的那样被破解在一起。

相关文章: