Je ne sais pas grand chose sur CTTPES, il a récemment commencé à travailler avec elle.
J'ai une fonction simple dans la DLL de type C qui retourne un pointeur à la chaîne générée dynamiquement.
Cela fonctionne bien, mais, parce que je suis alloué manuellement de la mémoire pour la chaîne, je devrais la libérer après utilisation. P>
J'ai quelque chose comme ceci: p>
extern "C" char* DLL_EXPORT func(const char* str1, const char* str2) { return getSomeString(str1, str2); } // Goal is to call this function correctly from Python. extern "C" void DLL_EXPORT freeMem(void *mem) { if(mem!=NULL) delete mem; }
3 Réponses :
Vous êtes sur la bonne voie.
# Test.py import ctypes lib = ctypes.cdll.TestDLL # this creates a c-style char pointer, initialized with a string whose # memory is managed by PYTHON! do not attempt to free it through the DLL! cstr = ctypes.c_char_p("hello ctypes") # call the dll function that returns a char pointer # whose memory is managed by the DLL. p = lib.stringdup(cstr) # p is just an integer containing the memory address of the # char array. therefore, this just prints the address: print p # this prints the actual string print ctypes.c_char_p(p).value # free the memory through the DLL lib.stringfree(p)
stringdup.restype code> doit être réglé sur un type de pointeur, tel que
pointeur (C_char) code> car le type de résultat par défaut est un
int code> 32 bits . Pour obtenir une chaîne Python, vous pouvez utiliser
couler (p, c_char_p) .value code> ou
c_char_p.from_buffer (p) .value code>.
Normalement, chaque fonction que vous utilisez dans CTYPES CODE> doit avoir ses arguments et son type de retour déclaré afin que Python puisse vérifier le bon numéro et le type d'arguments et convertir des arguments d'objet Python aux objets de données C correctionnels. Malheureusement, dans ce cas, la valeur de retour normale pour
Func code> serait
c_char_p code>, mais
ctypes code> essaie d'être utile et de convertir un
c_char_p < / Code> Valeur de retour à une chaîne Python, perdant l'accès à la valeur du pointeur C brut. Au lieu de cela, vous pouvez déclarer le type de retour comme
c_void_p code> et utiliser
couler code> pour extraire la valeur de chaîne, ce qui laisse la valeur de retour A "code> c_char_p code> objet. < P> Voici un exemple (python 3): p>
pour moi
Voir Stackoverflow.com/questions/7398575/... .