[Python] ctypes: Passing string by reference

Discussão em 'Python' iniciado por Stack, Novembro 27, 2024.

  1. Stack

    Stack Membro Participativo

    With regard to Python 2.5, I wish to implement the following C code in python:

    C code:

    #include <wtypes.h>

    __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 code:

    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)


    But I'm getting the following exception:

    Traceback (most recent call last):
    status = getAdmSize(byref(iProgSize), (szProgSize), 49)
    ArgumentError: argument 2: <type 'exceptions.TypeError'>: expected LP_c_char_p instance instead of c_char_Array_50


    What am I doing wrong?

    UPDATE:

    I tried:

    pointerToStringBuffer = cast(szProgSize, c_char_p)
    status = getAdmSize(byref(iProgSize), byref(pointerToStringBuffer), 49)


    But this gives me:

    Traceback (most recent call last):
    status = getAdmSize(byref(iProgSize), byref(pointerToStringBuffer), 49)
    WindowsError: exception: access violation reading 0x00000031


    As a matter of interest, I get the same error in C if I call this:

    error = AdkGetAdmSize((int*)0, (char**)49, 0);


    Seems like my arguments are not aligned correctly perhaps

    Any suggestions?

    Continue reading...

Compartilhe esta Página