我有这个功能,用于与 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。我觉得可能有更好的方法来做到这一点?或者我可能只是错过了一些关于如何访问存储的字符串的内容?
答案 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!'