указатель передачи от python var до c lib - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть фиксированная C библиотека в виде файла DLL. Файл DLL имеет некоторые функции безопасности, поэтому я не могу заглянуть в библиотеку. Я знаю только имя функции и тип данных.

Мне нужно дать функции указатель на мою переменную в Python, адрес в памяти. Я пытаюсь использовать ctypes, но это не сработает. Для загрузки библиотеки. я использую ctypes.

Это функция со всеми необходимыми переменными, которые мне нужно запустить.

function  (
 const unsigned char* input_array,
 unsigned int multiply_by,
 unsigned char* output_array
);  

Итак, я инициализирую свои переменные в Python следующим образом:

input_array = "100"
multiply_by = 5
output_array = "000"

После этого я загружаю свою библиотеку и запускаю функцию.

lib = CDLL('func_lib.dll')
lib.function( hex(id(input_array)),
                 multiply_by,
                 hex(id(output_array))
             )

Функция не изменит переменную output_array, которая является ее целью. Я вижу, что функция вызывается, потому что не вызывается ошибка. Я правильно обращаюсь с указателями?

РЕДАКТИРОВАТЬ: я упростил функцию до 3 переменных, это было бы то же самое для большего количества. Также я думаю, что input_array является проблемой. Вызванная функция возвращает мне код обратной связи, который говорит, что input_array неверен. Я не знаю, как отправить адрес указателя в функцию.

1 Ответ

0 голосов
/ 13 февраля 2020

Параметр bigarray объявлен const unsigned char * в сигнатуре функции. Если это правильно, то у переменной bigarray мало шансов измениться.

РЕДАКТИРОВАТЬ Подводя итог комментариям, мы надеемся, что это рабочий пример с исходной сигнатурой функции.

    # Load the lib
    lib = CDLL('func_lib.dll')

    # Defines signature, based on C one
    lib.function.argtypes = [ c_char_p, c_uint, c_char_p ]

    # Call parameters
    data_in = b'Sample input'
    data_out = create_string_buffer(16)

    # Call
    lib.function(data_in, 16, data_out)

Одно предположение: я предположил, что вторым параметром является размер буфера, поэтому в примере вызова я дал то же значение, что и create_string_buffer.
Вызов create_string_buffer здесь требуется, имеет ли это выход для вашей функции. Помните, что здесь существует очевидный риск переполнения буфера.

...