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)
得到了如下错误:
请问IntPtr在python中对应的类型是什么,我使用的参数类型是否有误,我无法找到原始的c++ DLL文件
以上是 python调用c++DLL,"The value of ESP was not ..." 的全部内容, 来源链接: utcz.com/p/938135.html