c_int python ctypes

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?