myPythonClient Code> (ci-dessous) veut appeler une fonction
Ringbell code> (chargé à partir d'une DLL à l'aide de
CTTYPES code>). Cependant, tenter d'accéder à
Ringbell code> via son nom em> dans un
attributeError code>. Pourquoi?
ringbell.h code> contient p>
ringbell.cpp code> contient p>
myPythonClient.py code> contient p>
3 Réponses :
Peut-être parce que le nom C ++ est géré par le compilateur et non exporté de la DLL comme Ringbell code>. Avez-vous vérifié qu'il apparaît dans les noms exportés comme ça? P>
Vous étiez correct. J'ai utilisé ce qui suit pour découvrir le nom "Mangled": link.exe / décharge / exportations ringbell.dll et découverte que, dans la DLL, le nom de la fonction était "? Ringbell @ myClass @ myNamespace @@ Sahxz". Merci!
Je mentionnerai également que j'ai utilisé la fonction GetatTatr de Python pour obtenir une référence à la fonction Ringbell: myRingBellfunction = getattr (CDLL.Ringbell, "? Ringbell @ myClass @ myNamespace @@ Sahxz") MyRingbellfunction () # Invoquer la fonction à nouveau
Votre compilateur C ++ gère les noms de tous les objets visibles de l'extérieur à réfléchir (ainsi que de noms sous-jacents) leurs espaces de noms, classes et signatures (c'est ainsi que la surcharge devient possible). P>
Afin d'éviter cette mangling, vous avez besoin d'un externe "C" code> sur des noms visibles externes que vous souhaitez être visible à partir de code non-C ++ (et donc de tels noms ne peuvent pas être surchargés, ni dans C ++ Standard peut-il être en ligne, dans les espaces de noms ou dans les classes, bien que certains compilateurs C ++ prolongent la norme dans certaines de ces directions). P>
J'ai donné "externe" un essai et ça fonctionnait! La solution est ci-dessous pour les futurs lecteurs: #include
Tout fonctionne maintenant :) Pour résumer vos messages:
écrire DLL en C ++: p> alors vous pouvez utiliser programme link.exe pour voir le nom de la fonction réelle en dll.
link.exe est par exemple dans msvc2010 ici: p> Utilisation: p> Vous voyez quelque chose comme: p > puis dans Python, vous pouvez l'importer comme: p>