python调用c++DLL,"The value of ESP was not ..."

新手上路,请多包涵

我使用python3.7 32bit调用别人提供的c++ dll,该dll的有一个c#的参考使用方法,其中,一个函数的调用在c#中的详细参数如下

[DllImport("EspecDll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern UInt32 ESPEC_Init(UInt32 CommPort, UInt32 Baud, Char Parity, UInt16 DataBits, UInt16 StopBits,string lpPhoneNo, IntPtr lpDeviceSelectFlag, IntPtr lpDeviceIs2000AFlag, MESSAGE_PROC lpMessageProc);

其中MESSAGE_PROC在c#中为一个委托,具体类型如下:

MESSAGE_PROC lpMessageProc;
public delegate int MESSAGE_PROC(UInt32 MessageID, UInt32 MacID, IntPtr lpParam);

该函数在c#中可正常使用。
我在python中仿照该函数的写了如下代码
首先,我使用ctypes定义了一个CFUNCTION类型

self.MESSAGEPROC = CFUNCTYPE(c_uint, c_uint, c_uint, c_void_p)

然后,我对ESPEC_Init函数进行了如下声明

self.pDLL.ESPEC_Init.argtypes = [c_uint32, c_uint32, c_wchar, c_uint16, c_uint16, c_wchar_p,c_void_p, c_void_p, self.MESSAGEPROC]
self.pDLL.ESPEC_Init.restype = c_uint32

随后,我实现了一个MESSAGEPROC函数:

def MessageProc(MessageID, MACID, ptrBuffer)

lpMessageProc = MESSAGEPROC(MessageProc)

然后运行

pDLL.ESPEC_Init(ComPort, c_uint32(19200), c_wchar('n'),c_uint16(8), c_uint16(1), te, pDeviceBuffer, pFlagBuffer, lpMessageProc)

得到了如下错误:
image.png
请问IntPtr在python中对应的类型是什么,我使用的参数类型是否有误,我无法找到原始的c++ DLL文件

阅读 1.6k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题