首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python c ctypes中删除指向字符串数组的指针

在Python c ctypes中删除指向字符串数组的指针
EN

Stack Overflow用户
提问于 2018-05-30 17:53:24
回答 1查看 1.4K关注 0票数 0

我有从C库与光学激光调谐器通信的功能。

代码语言:javascript
复制
long EXPORT newp_usb_get_model_serial_keys (char** ppBuffer);

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

我在Python2.7.15中将以下函数定义为与激光通信的几个函数之一:

代码语言:javascript
复制
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只会返回

代码语言:javascript
复制
<ctypes.c_char_Array_1025 object at 0x0000000013557AC8>

这似乎与我在其他人关于类似话题的问题上所看到的非常不同。

我尝试过使用指针()而不是指针(),但是对于指针()的第一个参数,指向字符串数组的指针似乎没有ctype。我觉得有更好的方法吗?或者我只是遗漏了一些关于如何访问被存储的字符串的东西?

EN

回答 1

Stack Overflow用户

发布于 2018-05-30 19:04:11

函数是如何返回值的还不清楚,但从名称上看,它可能是返回一个指针,指向带有串行/模型信息的内部静态缓冲区,因此这应该可以工作。注意,我已经为某些类型检查设置了函数的.argtypes.restype

测试DLL:

代码语言:javascript
复制
#define EXPORT __declspec(dllexport)

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

Python:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
b'hello, world!'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50610792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档