Разыменование указателя на массив строк в типах Python - PullRequest
0 голосов
/ 30 мая 2018

У меня есть эта функция для связи с оптическим лазерным тюнером из библиотеки 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 для указателя на строковый массивдля первого аргумента POINTER ().Я чувствую, что может быть лучший способ сделать это?Или, может быть, я просто что-то здесь упускаю из-за того, как получить доступ к хранимым строкам?

1 Ответ

0 голосов
/ 30 мая 2018

Неясно, как функция возвращает значение, но из имени она может возвращать указатель на внутренний статический буфер с информацией о последовательном / модели, так что это должно работать.Примечание. Я установил .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!'
...