Python ctypes, аргументы функции dll - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть DLL с функцией

EXPORT long Util_funct( char *intext, char *outtext, int *outlen )

Похоже, она ожидает char * intext, char * outtext, int * outlen.Я пытался определить разные типы данных в python, чтобы я мог передать аргумент, но пока безуспешно.

from ctypes import *

string1 = "testrr"
#b_string1 = string1.encode('utf-8')

dll = WinDLL('util.dll')
funct = dll.Util_funct

funct.argtypes = [c_wchar_p,c_char_p, POINTER(c_int)]
funct.restype = c_char_p

p = c_int()
buf = create_string_buffer(1024)
retval = funct(string1, buf, byref(p))

print(retval)

Вывод - Нет, но я вижу некоторые изменения в p.Не могли бы вы помочь мне определить правильные типы данных для функции.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Спасибо за все ваши ответы!Я думаю, что я понял это.Использовать не самый умный способ, а просто пробовать / экспериментировать с разными типами данных.Поскольку это не обычная библиотека, и у меня не было информации для нее, возможно, решение не будет очень полезным для других, но в любом случае.

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

from ctypes import *


buf = create_unicode_buffer(1024)
string1 = "a"
c_s = c_wchar_p(string1)

dll = CDLL('util.dll')
enc = dll.Util_funct

enc.argtypes = c_wchar_p, c_wchar_p, POINTER(c_int)

enc.restype = c_long # i don't think this type matters at all

p = c_int()


enc(c_s, buf, byref(p))


print(p.value)
print(buf.value)

вывод 1 и символ ^

Еще раз спасибо

0 голосов
/ 22 февраля 2019

Это должно работать:

from ctypes import *

string1 = b'testrr'     # byte string for char*

dll = CDLL('util.dll')  # CDLL unless function declared __stdcall
funct = dll.Util_funct

funct.argtypes = c_char_p,c_char_p,POINTER(c_int) # c_char_p for char*
funct.restype = c_long # return value is long

p = c_int()
buf = create_string_buffer(1024) # assume this is big enough???
retval = funct(string1, buf, byref(p))

print(retval)
...