gpt4 book ai didi

python - 从 Python 调用的 C++ dll

转载 作者:行者123 更新时间:2023-11-30 01:55:02 24 4
gpt4 key购买 nike

我使用了一个使用 MFC 的 C++ dll,我想从 python 调用它。此 dll 在 .h 文件中包含此 header

LONG CommOpen(BYTE port, LONG baud_rate);

然后我在免费软件dllexp中看到我的函数在二进制文件中叫做?CommOpen@CFIPcmd@@QAEJEJ@Z所以我在python中没有报错

import ctypes

lib = ctypes.WinDLL('C:\\Users\\toto\\FIProtocol.dll')
prototype = WINFUNCTYPE(c_long, c_byte, c_long)
testPt = ctypes.WINFUNCTYPE (prototype)
testApi = testPt (("?CommOpen@CFIPcmd@@QAEJEJ@Z", lib))

直到那里它似乎工作但后来我想在 Python 中调用 C++ 中的等价物

Long l= CommOpen(5 ,115200);

但我不知道如何进行。任何帮助将不胜感激!!

最佳答案

鉴于问题中提供的信息,解决方案是:

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

现在可以调用了:

l = CommOpen(5 ,115200)

一些注意事项:

  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 风格的包装器,或者找到一种不同的互操作方法。

关于python - 从 Python 调用的 C++ dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21184911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com