2014-04-25 29 views
3

我想寫一個非常簡單的控制器在WinXP機器上的攝像頭。我認爲我會簡單地使用ctypes來訪問dll,而不是編寫c代碼。調用一個dll函數,需要一個指針從python的句柄(win32)

要啓動照相機,你必須調用:

BeginHVDevice(int nDevice, HHV *pHandle) 

* pHandle是一個指向相機手柄,這在the.h文件被簡單地定義爲

的typedef拉手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

看來功能是使用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 
+0

是的,那正是問題所在。非常感謝 – user3571864

相關問題