11
votes

Comment transmettre le pointeur dans CTTYPES?

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 :


11
votes

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)


1 commentaires

stringdup.restype doit être réglé sur un type de pointeur, tel que pointeur (C_char) car le type de résultat par défaut est un int 32 bits . Pour obtenir une chaîne Python, vous pouvez utiliser couler (p, c_char_p) .value ou c_char_p.from_buffer (p) .value .



11
votes

Normalement, chaque fonction que vous utilisez dans CTYPES 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 serait c_char_p , mais ctypes 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 et utiliser couler pour extraire la valeur de chaîne, ce qui laisse la valeur de retour A "code> c_char_p objet. < P> Voici un exemple (python 3): xxx


0 commentaires

0
votes

pour moi xxx


0 commentaires