从Python调用一个接收句柄指针的DLL函数(Win32)
我正在尝试为一台运行Windows XP的机器写一个非常简单的相机控制器。我本来打算用C语言来写,但我想直接用ctypes来访问dll文件,这样可能更简单。
要启动相机,你需要调用:
BeginHVDevice(int nDevice, HHV *pHandle)
*pHandle是一个指向相机句柄的指针,在.h文件中,它被简单地定义为
typedef HANDLE HHV;
我原以为下面的代码应该可以工作:
from ctypes import *
from ctypes.wintypes import *
ailt_lib = cdll.LoadLibrary("HVDAILT")
load_camera = ailt_lib.BeginHVDevice
load_camera.restype = c_int
load_camera.argtypes = [c_int, POINTER(HANDLE)]
def initDev(res=(800,600)):
cam_int = c_int(1)
cam_handle_type = POINTER(HANDLE)
print cam_handle_type
cam_handle = cam_handle_type()
print cam_handle
cam_stat = load_camera(cam_int, cam_handle )
print cam_stat
return cam_handle
但是,当我调用initDev()时,出现了一个错误,提示ValueError: Procedure called with not enough arguments (8 bytes missing) or wrong calling convention。这让我觉得可能是我传递的指针不兼容,但我搞不清楚这个函数实际上需要什么样的参数。
我花了几天时间在StackOverflow上搜索,查看ctypes的文档,尝试各种组合,但还是没有找到答案。
相关问题:
- Python 调用 DLL 时报错 "WindowsError: exception: access violation reading 0x00000004
- 通过ctypes在扩展DLL中使用类需要帮助
- Python与Ctypes:将结构体作为指针传递给函数以获取数据
- Python ctypes - dll 函数接受结构体崩溃
- LoadLibraryA方法在加载/卸载超过1000次后返回错误代码1114 (ERROR_DLL_INIT_FAILED)
- 在Python中使用GetExtendedTcpTable
- WindowsError: 异常:访问冲突..." - ctypes 问题
- Ctypes 的优缺点
1 个回答
1
看起来这个函数使用的是 stdcall 调用约定,而不是 cdecl。也就是说,你应该用 ctypes.WinDLL 来代替 ctypes.CDLL。另外,它需要一个指向内存位置的指针,以便可以存储句柄,但你传递了一个 NULL 指针。你应该传递一个指向 wintypes.HANDLE 的引用。
from ctypes import *
from ctypes.wintypes import *
ailt_lib = WinDLL("HVDAILT")
load_camera = ailt_lib.BeginHVDevice
load_camera.restype = c_int
load_camera.argtypes = [c_int, POINTER(HANDLE)]
def initDev(res=(800,600)):
cam_int = 1
cam_handle = HANDLE()
cam_stat = load_camera(cam_int, byref(cam_handle))
print 'cam_stat:', cam_stat
print 'cam_handle:', cam_handle
return cam_handle