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

时间:2014-04-25 09:08:22

标签: python ctypes

我试图在WinXP机器上为相机编写一个非常简单的控制器。我没想写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文档并尝试各种排列,但我没有找到答案。

1 个答案:

答案 0 :(得分: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