Python HANDLE 的 ctypes
Python ctypes for HANDLE
我有一个 DLL 函数,其原型如下:
short Connect(HANDLE* pHandle, UINT* pTimerID, LPCTSTR strDestination, LPCTSTR strServiceName, int nProtocol, int nType)
功能说明如下:
pHandle: socket handle.[out]
pTimerID: Timer ID using sending alive packet to a camera.[out]
strDestination: camera network IP.[in]
strServiceName: camera network port.[in]
nProtocol: address family(AF_INET).[in]
nType: Socket type(SOCK_STREAM or SCOK_DGRAM).[in]
我尝试从 python 调用它 DLL,如下所示:
DLL = windll.LoadLibrary('myDll.dll')
self.UserID = 0
self.keepAliveID = 0
DLL.Connect.restype = ctypes.c_short
DLL.Connect.argtypes = [c_void_p, c_ulong, c_wchar_p, c_wchar_p, c_int, c_int]
try:
err = DLL.Connect(self.UserID,self.keepAliveID,self.ip,self.port,2,1)
if err == -1:
print "connect ErrorCode = ", err
except:
print "connect Exception = ", sys.exc_info()
在 运行 程序之后我得到了这个异常:
connect Exception = (<type 'exceptions.WindowsError'>, WindowsError('exception: access violation writing 0x00000000',), <traceback object at 0x0262C300>)
- 我的错误在哪里?
- C++ DLL中HANDLE的数据类型是什么,如何使用ctypes进行转换?
第二个问题是当我把argtypes
改成如下:
DLL.Connect.argtypes = [c_void_p, POINTER(c_ulong), c_wchar_p, c_wchar_p, c_int, c_int]
然后我得到另一个异常:
connect Exception = (<class 'ctypes.ArgumentError'>, ArgumentError("argument 2: <type 'exceptions.TypeError'>: expected LP_c_ulong instance instead of int",), <traceback object at 0x0261A328>)
请帮忙!
尝试像这样重新定义函数调用:
from ctypes import *
from ctypes.wintypes import *
dll = WinDLL('myDll.dll')
connect = dll.Connect
connect.restype = c_short
connect.argtypes = [POINTER(HANDLE), POINTER(UINT), LPCWSTR, LPCWSTR, c_int, c_int)
然后这样调用,使用byref
通过引用传递:
self.user_id = HANDLE()
self.keep_alive_id = UINT()
err = connect(byref(self.user_id), byref(self.keep_alive_id), self.ip, self.port, 2, 1)
当然未经测试,但这至少应该让你更接近。
我有一个 DLL 函数,其原型如下:
short Connect(HANDLE* pHandle, UINT* pTimerID, LPCTSTR strDestination, LPCTSTR strServiceName, int nProtocol, int nType)
功能说明如下:
pHandle: socket handle.[out]
pTimerID: Timer ID using sending alive packet to a camera.[out]
strDestination: camera network IP.[in]
strServiceName: camera network port.[in]
nProtocol: address family(AF_INET).[in]
nType: Socket type(SOCK_STREAM or SCOK_DGRAM).[in]
我尝试从 python 调用它 DLL,如下所示:
DLL = windll.LoadLibrary('myDll.dll')
self.UserID = 0
self.keepAliveID = 0
DLL.Connect.restype = ctypes.c_short
DLL.Connect.argtypes = [c_void_p, c_ulong, c_wchar_p, c_wchar_p, c_int, c_int]
try:
err = DLL.Connect(self.UserID,self.keepAliveID,self.ip,self.port,2,1)
if err == -1:
print "connect ErrorCode = ", err
except:
print "connect Exception = ", sys.exc_info()
在 运行 程序之后我得到了这个异常:
connect Exception = (<type 'exceptions.WindowsError'>, WindowsError('exception: access violation writing 0x00000000',), <traceback object at 0x0262C300>)
- 我的错误在哪里?
- C++ DLL中HANDLE的数据类型是什么,如何使用ctypes进行转换?
第二个问题是当我把argtypes
改成如下:
DLL.Connect.argtypes = [c_void_p, POINTER(c_ulong), c_wchar_p, c_wchar_p, c_int, c_int]
然后我得到另一个异常:
connect Exception = (<class 'ctypes.ArgumentError'>, ArgumentError("argument 2: <type 'exceptions.TypeError'>: expected LP_c_ulong instance instead of int",), <traceback object at 0x0261A328>)
请帮忙!
尝试像这样重新定义函数调用:
from ctypes import *
from ctypes.wintypes import *
dll = WinDLL('myDll.dll')
connect = dll.Connect
connect.restype = c_short
connect.argtypes = [POINTER(HANDLE), POINTER(UINT), LPCWSTR, LPCWSTR, c_int, c_int)
然后这样调用,使用byref
通过引用传递:
self.user_id = HANDLE()
self.keep_alive_id = UINT()
err = connect(byref(self.user_id), byref(self.keep_alive_id), self.ip, self.port, 2, 1)
当然未经测试,但这至少应该让你更接近。