8
votes

Python: accéder à la fonction DLL à l'aide de CTYPES - Accès par fonction * Nom * échoue

myPythonClient (ci-dessous) veut appeler une fonction Ringbell (chargé à partir d'une DLL à l'aide de CTTYPES ). Cependant, tenter d'accéder à Ringbell via son nom dans un attributeError . Pourquoi?

ringbell.h contient xxx

ringbell.cpp contient xxx

myPythonClient.py contient xxx


0 commentaires

3 Réponses :


7
votes

Peut-être parce que le nom C ++ est géré par le compilateur et non exporté de la DLL comme Ringbell . Avez-vous vérifié qu'il apparaît dans les noms exportés comme ça?


2 commentaires

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



10
votes

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).

Afin d'éviter cette mangling, vous avez besoin d'un externe "C" 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).


1 commentaires

J'ai donné "externe" un essai et ça fonctionnait! La solution est ci-dessous pour les futurs lecteurs: #include externe "c" __declspec (dllexport) int __cdecl ringbell (vide) {std :: cout << "\ a"; retour 0; }



10
votes

Tout fonctionne maintenant :) Pour résumer vos messages:

écrire DLL en C ++: xxx

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: xxx

Utilisation: xxx

Vous voyez quelque chose comme: xxx

puis dans Python, vous pouvez l'importer comme: xxx


0 commentaires