【问题标题】:python ctypes - wrap void pointerpython ctypes - 包装空指针
【发布时间】:2017-10-06 15:56:20
【问题描述】:

我正在通过 ctypes 将 C 库包装到 Python 中。目前,我在一个参数上停留在一行或多行。这里是 C 代码:

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 指针吗?

非常感谢!

【问题讨论】:

  • 您通过引用传递指针,但示例 C 代码通过值传递它。使用gVimbaHandle = c_void_p(1)VmbFeatureBoolGet(gVimbaHandle, "GeVTLIsPresent", byref(isGigE))
  • 哦,是的,没错,有点混淆了 python 和 C 指针组合的东西,没有看到这个......非常感谢。为我修好了。如果您将其发布为答案,我会将其标记为解决方案。再次感谢

标签: python c sdk ctypes word-wrap


【解决方案1】:

所以解决方案/答案是:

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

感谢@eryksun

【讨论】:

    猜你喜欢
    • 2017-05-02
    • 1970-01-01
    • 2016-11-04
    • 2014-01-23
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    相关资源
    最近更新 更多