From: Podi on 27 Sep 2006 21:58 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
From: Gabriel Genellina on 28 Sep 2006 02:43 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
From: Podi on 28 Sep 2006 12:45 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))
|
Pages: 1 Prev: Using py2exe to wrap a service? Next: pyj file extension |