如何在不使用com的情况下调用perl中的C++dll
How can I call a C++ dll in perl without using com?
我正在寻找在不使用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示例中所示的那样被破解在一起。
- 在这种情况下,java对象是否可以调用本机函数
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- Doxygen - 如何在不生成图形的情况下生成文本调用关系结果
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- C++ - 如何在不调用其属性的情况下调用类?
- 有没有办法在没有虚拟的情况下使用基类指针调用派生类函数
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在这种情况下,工会成员会调用自己的析构函数吗
- 如何在不迭代的情况下对数组中的每个元素调用方法
- C++-在没有自定义.lib文件的情况下从Lua C模块调用Lua函数
- 如何在派生类中不显式调用base::func()的情况下从基类执行虚拟函数
- C++ 在不释放内存的情况下调用析构函数
- Python在不引用类名的情况下调用类函数
- C++11 - 获取编译时的所有类变量,并在没有 Boost 的情况下为它们调用方法
- C ++:如何在不创建对象的情况下在主函数中调用方法
- 为什么在这种情况下调用非常量右值移动构造函数?
- 在这种情况下,我应该为每个WSASend调用传递唯一的重叠结构吗?
- C++ 在不知道子类型的情况下从父类型调用子方法