Я мог бы использовать некоторую помощь при назначении глобальной переменной C в DLL с использованием ctypes.Python ctypes in_dll назначение строки
Ниже приведен пример того, что я пытаюсь:
test.c содержит следующую
#include <stdio.h>
char name[60];
void test(void) {
printf("Name is %s\n", name);
}
на окнах (Cygwin) Я построить DLL (test.dll) следующим образом:
gcc -g -c -Wall test.c
gcc -Wall -mrtd -mno-cygwin -shared -W1,--add-stdcall-alias -o Test.dll test.o
При попытке изменить переменную name
и затем вызвать функцию теста с помощью интерфейса ctypes я получаю следующее ...
>>> from ctypes import *
>>> dll = windll.Test
>>> dll
<WinDLL 'Test', handle ... at ...>
>>> f = c_char_p.in_dll(dll, 'name')
>>> f
c_char_p(None)
>>> f.value = 'foo'
>>> f
c_char_p('foo')
>>> dll.test()
Name is Name is 4∞┘☺
13
Почему тестовая функция печатает мусор в этом случае?
Update:
Я подтвердил ответ Алекса. Вот рабочий пример:
>>> from ctypes import *
>>> dll = windll.Test
>>> dll
<WinDLL 'Test', handle ... at ...>
>>> f = c_char_p.in_dll(dll, 'name')
>>> f
c_char_p(None)
>>> libc = cdll.msvcrt
>>> libc
<CDLL 'msvcrt', handle ... at ...>
#note that pointer is required in the following strcpy
>>> libc.strcpy(pointer(f), c_char_p("foo"))
>>> dll.test()
Name is foo
Я проголосовал, но, проведя еще несколько проверок, я думаю, что может произойти что-то еще. Я считаю, что исходный метод OP для присвоения новой строки 'ctype.c_char_p.value' _is_ правильный подход. Меня устраивает. Я также считаю, что подход 'strcpy' может работать здесь, где имя malloc'd имеет 59 + NUL символов, но в другой ситуации может возникнуть ошибка сегментации. –
одна строка кода стоит thausand words: 'f = c_char_p(); buff =" guarda mamma, senza mani! "; F.value = buff; cast (f, POINTER (c_char)) [0] =" G "; печать (бафф) '. Говорить 'f.value =" что-то "ограничивает f тем, что будет жить короткой жизнью. – FxIII