我有从C库与光学激光调谐器通信的功能。
long EXPORT newp_usb_get_model_serial_keys (char** ppBuffer);其中"ppbuffer“是”指向以空结尾的字符数组的指针,其中数组索引是'DeviceID‘,每个元素都包含模型/序列号键“(来自库头文件)。该函数创建ppbuffer描述中提到的数组,并返回0表示成功,非零表示失败。
我在Python2.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 arraynewp_usb_get_model_serial_keys函数是成功的,但是我在取消引用pbuf指针时遇到了困难。我一直在努力理解一些方法,比如使用cast() (我不确定这是否是最好的方法),而使用pbuf.contents只会返回
<ctypes.c_char_Array_1025 object at 0x0000000013557AC8>这似乎与我在其他人关于类似话题的问题上所看到的非常不同。
我尝试过使用指针()而不是指针(),但是对于指针()的第一个参数,指向字符串数组的指针似乎没有ctype。我觉得有更好的方法吗?或者我只是遗漏了一些关于如何访问被存储的字符串的东西?
发布于 2018-05-30 19:04:11
函数是如何返回值的还不清楚,但从名称上看,它可能是返回一个指针,指向带有串行/模型信息的内部静态缓冲区,因此这应该可以工作。注意,我已经为某些类型检查设置了函数的.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!'https://stackoverflow.com/questions/50610792
复制相似问题