2017-05-08 103 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