gpt4 book ai didi

python - 调用一个 dll 函数,该函数从 python 获取指向句柄 (win32) 的指针

转载 作者:行者123 更新时间:2023-11-28 18:43:31 25 4
gpt4 key购买 nike

我正在尝试为 WinXP 机器上的相机编写一个非常简单的 Controller 。与其编写 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:调用的过程没有足够的参数(缺少 8 个字节)或错误的调用约定。我很确定这意味着我没有生成要传递的兼容指针,但我无法弄清楚该函数实际想要接收什么。

我花了几天时间搜索 stackoverflow,查看 ctypes 文档并尝试各种排列,但我没有找到答案。

最佳答案

似乎该函数正在使用 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

关于python - 调用一个 dll 函数,该函数从 python 获取指向句柄 (win32) 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23288781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com