2017-05-08 49 views
1

我正在通過ctypes將C庫包裝到Python中。此刻,我堅持一行或多行參數。這裏的C代碼:python ctypes - wrap void pointer

void* gVimbaHandleFake = (void*)1; 
err = VmbFeatureBoolGet(gVimbaHandleFake, "GeVTLIsPresent", &isGigE); 

問題是這個奇怪的void指針。一般來說,我知道什麼是無效指針,但這個似乎是「特殊的」。如果我更改(void*)1中的1,則程序不再工作(這是關於查找網絡攝像頭的)。它不會崩潰,但不會再找到相機。

我嘗試了很多不同的東西,在Python的最後嘗試:

gVimbaHandle = cast(1, c_void_p) 
err = self.dll.VmbFeatureBoolGet(byref(gVimbaHandle), "GeVTLIsPresent", byref(isGigE)) 

也嘗試了「正常」的方式:

gVimbaHandle = c_void_p(1) 

我的節目心不是崩潰,但它告訴我,手柄無效... 當我看着指針gVimbaHandle.value我得到1L作爲輸出。這可能是問題,長數據類型L

有沒有人知道如何解決這個問題,或者可以解釋C中的「特殊」(void*)1指針給我?

非常感謝!

+0

你路過的參考指針,但C語言代碼按值傳遞。使用'gVimbaHandle = c_void_p(1)'和'VmbFeatureBoolGet(gVimbaHandle,「GeVTLIsPresent」,byref(isGigE))''。 – eryksun

+0

噢,這是正確的,是有點與Python和C指針組合的東西混淆,沒有看到這個......非常感謝你。爲我修好了。如果你把它作爲答案發布,我會將其標記爲解決方案。再次感謝 –

回答

1

因此,解決辦法/回答是:

gVimbaHandle = c_void_p(1) 
err = self.dll.VmbFeatureBoolGet(gVimbaHandle, "GeVTLIsPresent", byref(isGigE)) 

感謝@eryksun