ctypes pointer to pointer

Discussion in 'Python' started by Podi, Sep 28, 2006.

  1. Podi

    Podi Guest

    Hi,

    I have a C function in the dll does the following:

    DLL_API int dll_foo(char **data, size_t *size)
    {
    strcpy(*data, "hello");
    *size = strlen(*data);

    return 0;
    }


    So I would call the function as such,

    char data[8];
    size_t size;

    int status = dll_foo(&data, &size);

    I have tried the following in Python but not able to get it working...
    Any help would be appreciated!

    from ctypes import *
    mydll = windll.mydll
    array = c_char * 8
    data = array()
    size = c_long()
    status = mydll.dll_foo(byref(data), byref(size))
    Traceback (most recent call last):
    File "<interactive input>", line 1, in ?
    WindowsError: exception: access violation writing 0x00000000


    mydll.dll_foo(POINTER(data), byref(size))
    Traceback (most recent call last):
    File "<interactive input>", line 1, in ?
    File "C:\Python24\Lib\site-packages\ctypes\__init__.py", line 197, in
    POINTER
    return _pointer_type_cache[cls]
    TypeError: unhashable type

    out = c_char_p(data.raw)
    mydll.dll_foo(byref(out), byref(size))
    Traceback (most recent call last):
    File "<interactive input>", line 1, in ?
    ValueError: Procedure probably called with too many arguments (8 bytes
    in excess)

    mydll..dll_foo(out, byref(size))
    Traceback (most recent call last):
    File "<interactive input>", line 1, in ?
    WindowsError: exception: access violation writing 0x6C6C6568

    temp = create_string_buffer('\000' * 32)
    mydll.dll_foo(temp, byref(size))
    Traceback (most recent call last):
    File "<interactive input>", line 1, in ?
    WindowsError: exception: access violation writing 0x00000000

    mydll.dll_foo(byref(temp), byref(size))
    Traceback (most recent call last):
    File "<interactive input>", line 1, in ?
    WindowsError: exception: access violation writing 0x00000000
     
    Podi, Sep 28, 2006
    #1
    1. Advertising

  2. At Wednesday 27/9/2006 22:58, Podi wrote:

    >I have a C function in the dll does the following:
    >
    >DLL_API int dll_foo(char **data, size_t *size)
    >{
    > strcpy(*data, "hello");
    > *size = strlen(*data);
    >
    > return 0;
    >}
    >
    >
    >So I would call the function as such,
    >
    >char data[8];
    >size_t size;
    >
    >int status = dll_foo(&data, &size);
    >
    >I have tried the following in Python but not able to get it working...
    >Any help would be appreciated!
    >
    >from ctypes import *
    >mydll = windll.mydll
    >array = c_char * 8
    >data = array()
    >size = c_long()
    >status = mydll.dll_foo(byref(data), byref(size))
    >Traceback (most recent call last):
    > File "<interactive input>", line 1, in ?
    >WindowsError: exception: access violation writing 0x00000000


    I'd use your last try. But since it didnt work, use a prototype and
    see what happens:

    data = create_string_buffer('\000' * 8)
    size = c_long()
    dll_foo = mydll.dll_foo
    dll_foo.argtypes = [POINTER(c_char_p), POINTER(c_long)]
    status = dll_foo(byref(data), byref(size))

    Are you sure your function is compiled using the stdcall calling
    convention? I'm not sure what means DLL_API.



    Gabriel Genellina
    Softlab SRL





    __________________________________________________
    Preguntá. Respondé. Descubrí.
    Todo lo que querías saber, y lo que ni imaginabas,
    está en Yahoo! Respuestas (Beta).
    ¡Probalo ya!
    http://www.yahoo.com.ar/respuestas
     
    Gabriel Genellina, Sep 28, 2006
    #2
    1. Advertising

  3. Podi

    Podi Guest

    Thanks for the help. I've figured it out. BTW, DLL_API is defined as

    #ifdef MYDLL_EXPORTS
    #define DLL_API __declspec(dllexport)
    #else
    #define DLL_API __declspec(dllimport)
    #endif


    size = c_int()
    data = c_char_p('\0' * 8)
    mydll = cdll.mydll # Use cdll instead of windll to avoid warnings
    status = mydll.dll_foo(byref(data), byref(size))
     
    Podi, Sep 28, 2006
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Henk Punt
    Replies:
    0
    Views:
    417
    Henk Punt
    Jul 23, 2004
  2. Andrew Markebo
    Replies:
    1
    Views:
    808
    Peter Hansen
    Nov 17, 2004
  3. Replies:
    2
    Views:
    499
  4. Replies:
    0
    Views:
    522
  5. Grigory Petrov
    Replies:
    4
    Views:
    1,276
Loading...

Share This Page