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)

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

以上是 python调用c++DLL,"The value of ESP was not ..." 的全部内容, 来源链接: utcz.com/p/938135.html

回到顶部