在Python ctypes

时间:2018-05-30 17:53:24

标签: python-2.7 pointers ctypes

我有这个功能,用于与 C 库中的光学激光调谐器进行通信

long EXPORT newp_usb_get_model_serial_keys (char** ppBuffer);

其中“ppbuffer”是“指向空终止字符数组的指针,其中数组索引是'DeviceID',每个元素包含模型/序列号键”(来自库头文件)。该函数在ppbuffer的描述中创建数组提及,并返回0表示成功,非零表示失败。

我已经在Python 2.7.15中将以下函数定义为与激光通信的几个函数之一:

from ctypes import *

def get_key(self):
    buf = create_string_buffer('\000'*1024)
    pbuf = pointer(buf)
    nread = c_ulong()
    status = self.lib.newp_usb_get_model_serial_keys(pbuf)
    if status != 0:
        raise CommandError("error")
    else:
        # dereference pointer and store/return values in the array

newp_usb_get_model_serial_keys函数成功,但我一直无法解除引用pbuf指针。我一直在努力理解一些方法,比如使用cast()(我不确定这是否是最好用的),并且使用pbuf.contents只返回

<ctypes.c_char_Array_1025 object at 0x0000000013557AC8>

这与我在其他人对类似主题的问题上所看到的非常不同。

我尝试过使用POINTER()而不是指针()但是对于POINTER()的第一个参数指向字符串数组的指针似乎没有ctype。我觉得可能有更好的方法来做到这一点?或者我可能只是错过了一些关于如何访问存储的字符串的内容?

1 个答案:

答案 0 :(得分:1)

目前还不清楚该函数如何返回该值,但从名称中可能返回一个指向内部静态缓冲区的指针,其中包含序列/模型信息,因此这应该可行。注意我已为函数设置.argtypes.restype进行某些类型检查。

测试DLL:

#define EXPORT __declspec(dllexport)

long EXPORT newp_usb_get_model_serial_keys (char** ppBuffer)
{
    static char item[] = "hello, world!";
    *ppBuffer = item;
    return 1;
}

的Python:

from ctypes import *

dll = CDLL('test')
dll.newp_usb_get_model_serial_keys.argtypes = [POINTER(c_char_p)]
dll.newp_usb_get_model_serial_keys.restype = c_long

p = c_char_p()
dll.newp_usb_get_model_serial_keys(byref(p))
print(p.value)

输出:

b'hello, world!'