从Python调用C++ DLL

2024-05-26 00:33:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用MFC使用C++ DLL,我想用Python调用它。 此dll在.h文件中包含此头

LONG CommOpen(BYTE port, LONG baud_rate);

然后我在自由软件dllexp中看到我的函数被调用了?CommOpen@CFIPcmd@QAEJEJ@Z在二进制文件中,这样在python中执行时不会报告错误

^{pr2}$

直到它看起来有效,但我想调用Python中的等价于C++的

Long l= CommOpen(5 ,115200);

但我不知道该怎么做。 任何帮助都将非常感谢!!在


Tags: 文件函数rateport二进制bytelongdll
2条回答

根据http://docs.python.org/2/library/ctypes.html#calling-functions“你可以像任何其他Python可调用的那样调用这些函数。”我建议运行一个交互式Python控制台(如ipython)并亲自检查。在

好吧,我刚刚将python安装到VirtualBox Win32中并检查了示例:

>>> from ctypes import *
>>> f = getattr(cdll.msvcrt, "??2@YAPAXI@Z")
>>> f
<_FuncPtr object at 0x00B7EDC8>
>>> f()
24969248
>>> _

所以,是的,您可以像python环境中的任何其他函数一样调用这些函数对象。正如文件所说:)

同样地,ucputws也可以:

^{pr2}$

根据问题中提供的信息,解决方案是:

import ctypes

lib = ctypes.CDLL(r'C:\Users\toto\FIProtocol.dll')
CommOpen = getattr(lib, "?CommOpen@CFIPcmd@@QAEJEJ@Z")
CommOpen.argtypes = [c_byte, c_long]
CommOpen.restype = c_long

现在它准备好呼叫:

^{pr2}$

注意事项:

  1. 使用CDLL而不是WinDLL,因为函数使用了默认的cdecl调用约定。在
  2. 使用getattr可以指定损坏的名称。在
  3. 显式地指定argtypesrestype总是值得的。在

然而,它表明你有一个更大的问题。以上是基于您的函数是一个非成员函数而编写的。这是一个合理的假设,因为ctypes要求函数要么是非成员,要么是静态的。在

但是,当我将托管函数名放入demanger(例如http://pear.warosu.org/c++filtjs/)时,似乎该函数实际上是:

public: long __thiscall CFIPcmd::CommOpen(unsigned char,long)

这是C++对象的成员函数。无法从ctypes访问。您需要创建一个纯C风格的包装器,或者找到一个不同的互操作方法。在

相关问题 更多 >