Ctypes: передача строки по ссылкеPython

Программы на Python
Ответить
Anonymous
 Ctypes: передача строки по ссылке

Сообщение Anonymous »

Что касается Python 2.5, я хочу реализовать в Python следующий код C:

Код C:

Код: Выделить всё

#include 

__declspec(dllexport) X_ERROR __stdcall GetAdmSize(INT* piAdmSize, CHAR** chBuf, INT iBufSize);

int iProgSize = 0;
char szProgSize[50];
char* pszProgSize = szProgSize;
error = GetAdmSize(&iProgSize, &pszProgSize, 49);
Код Python:

Код: Выделить всё

from ctypes import *
c_bool = c_int

x = windll.LoadLibrary("x.dll")
iProgSize = c_int()
szProgSize = create_string_buffer(50)
getAdmSize = x.AdkGetAdmSize
getAdmSize.argtypes = [POINTER(c_int), POINTER(c_char_p), c_int]
status = getAdmSize(byref(iProgSize), byref(szProgSize), 49)
Но я получаю следующее исключение:

Код: Выделить всё

Traceback (most recent call last):
status = getAdmSize(byref(iProgSize), (szProgSize), 49)
ArgumentError: argument 2: : expected LP_c_char_p instance instead of c_char_Array_50
Что я делаю не так?

ОБНОВЛЕНИЕ:
Я пробовал:

Код: Выделить всё

pointerToStringBuffer = cast(szProgSize, c_char_p)
status = getAdmSize(byref(iProgSize), byref(pointerToStringBuffer), 49)
Но это дает мне:

Код: Выделить всё

Traceback (most recent call last):
status = getAdmSize(byref(iProgSize), byref(pointerToStringBuffer), 49)
WindowsError: exception: access violation reading 0x00000031
Интересно, что я получаю ту же ошибку в C, если вызываю это:

Код: Выделить всё

error = AdkGetAdmSize((int*)0, (char**)49, 0);
Похоже, мои аргументы выровнены неправильно

Есть предложения?

Подробнее здесь: https://stackoverflow.com/questions/107 ... -reference
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»