c_int - Python y ctypes: ¿cómo pasar correctamente "puntero a puntero" a DLL?
ctypes python linux (1)
Publicar código real. El código C / C ++ no se compila como C o C ++. El código de Python tiene errores de sintaxis (] que terminan de llamar a la función Foo. El siguiente código funciona. El problema principal después de corregir la sintaxis y los errores del compilador fue declarar la función __stdcall
para que se pueda usar windll
en el código Python. La otra opción es usar __cdecl
(normalmente el predeterminado) y usar cdll
lugar de windll
en el código de Python.
mydll.c (cl / W4 / LD mydll.c)
#include <stdlib.h>
__declspec(dllexport) void __stdcall Foo(unsigned char** ppMem, int* pSize)
{
char i;
*pSize = 4;
*ppMem = malloc(*pSize);
for(i = 0; i < *pSize; i++)
(*ppMem)[i] = i;
}
demo.py
from ctypes import *
Foo = windll.mydll.Foo
Foo.argtypes = [POINTER(POINTER(c_ubyte)),POINTER(c_int)]
mem = POINTER(c_ubyte)()
size = c_int(0)
Foo(byref(mem),byref(size))
print size.value,mem[0],mem[1],mem[2],mem[3]
Salida
4 0 1 2 3
Tengo una DLL que asigna memoria y la devuelve. La función en DLL es así:
void Foo( unsigned char** ppMem, int* pSize )
{
* pSize = 4;
* ppMem = malloc( * pSize );
for( int i = 0; i < * pSize; i ++ ) (* ppMem)[ i ] = i;
}
Además, tengo un código de Python que accede a esta función desde mi DLL:
from ctypes import *
Foo = windll.mydll.Foo
Foo.argtypes = [ POINTER( POINTER( c_ubyte ) ), POINTER( c_int ) ]
mem = POINTER( c_ubyte )()
size = c_int( 0 )
Foo( byref( mem ), byref( size ) ]
print size, mem[ 0 ], mem[ 1 ], mem[ 2 ], mem[ 3 ]
Espero que la print
muestre "4 0 1 2 3" pero que muestre "4 221 221 221 221" O_O. ¿Alguna pista de lo que estoy haciendo mal?