ctypes pointer to pointer

P

Podi

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
 
G

Gabriel Genellina

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
 
P

Podi

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))
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top