Python und ctypes: wie man richtig pass "pointer-to-pointer" in der DLL?
Ich habe eine DLL, die Speicher zuweist und gibt es zurück. Funktion in der DLL ist wie folgt:
void Foo( unsigned char** ppMem, int* pSize )
{
* pSize = 4;
* ppMem = malloc( * pSize );
for( int i = 0; i < * pSize; i ++ ) (* ppMem)[ i ] = i;
}
Außerdem habe ich ein python-code, der Zugriff auf diese Funktion aus meiner 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 ]
Ich gehe davon aus, dass print
zeigen "4 0 1 2 3" aber es zeigt, "4 221 221 221 221" O_O. Irgendwelche Hinweise, was ich falsch mache?
InformationsquelleAutor der Frage grigoryvp | 2010-11-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Post eigentlichen code. Die C/C++ - code kann nicht kompiliert werden, entweder als C oder C++. Der Python-code-syntax-Fehler (] beenden-Funktion aufrufen Foo). Der code unten funktioniert. Die wichtigste Frage nach der Festlegung der syntax und der compiler-Fehler war die Deklaration der Funktion
__stdcall
sowindll
könnte verwendet werden, in der Python-code. Die andere Möglichkeit ist die Verwendung__cdecl
(normalerweise die Standardeinstellung), und verwenden Siecdll
stattwindll
im Python-code.mydll.c (cl /W4 /LD mydll.c)
demo.py
- Ausgang
InformationsquelleAutor der Antwort Mark Tolonen