Python: Zugreifen auf DLL-Funktion mit Ctypes - Zugriff durch Funktion * Name * schlägt fehl

7

myPythonClient (unten) möchte eine ringBell -Funktion aufrufen (geladen von einer DLL mit ctypes ). Wenn Sie jedoch versuchen, über den Namen auf ringBell zuzugreifen, erhalten Sie AttributeError . Warum?

RingBell.h enthält

%Vor%

RingBell.cpp enthält

%Vor%

myPythonClient.py enthält

%Vor%     
J.J. Hakala 06.07.2009, 17:02
quelle

3 Antworten

7

Vielleicht, weil der C ++ - Name vom Compiler gemangelt und nicht aus der DLL als RingBell exportiert wird. Haben Sie überprüft, dass es genau so in den exportierten Namen erscheint?

    
Vinay Sajip 06.07.2009, 17:08
quelle
10

Ihr C ++ - Compiler migriert die Namen aller extern sichtbaren Objekte, um ihre Namespaces, Klassen und Signaturen (sowie ihre zugrundeliegenden Namen) widerzuspiegeln (so wird das Überladen möglich).

Um dies zu vermeiden, benötigen Sie extern "C" für extern sichtbare Namen, die aus Nicht-C ++ - Code sichtbar sein sollen (und deshalb können solche Namen nicht überladen werden, noch können sie im C ++ - Standard inline sein) Namespaces oder innerhalb von Klassen, obwohl einige C ++ - Compiler den Standard in einigen dieser Richtungen erweitern.)

    
Alex Martelli 06.07.2009 17:13
quelle
7

Alles funktioniert jetzt :) Um Ihre Beiträge zusammenzufassen:

Schreibe DLL in C ++:

%Vor%

Dann können Sie Programm link.exe verwenden, um den tatsächlichen Funktionsnamen in dll zu sehen. link.exe ist zum Beispiel in MSVC2010 hier:

%Vor%

verwenden:

%Vor%

Sie sehen etwas wie:

%Vor%

Dann in Python können Sie es als importieren:

%Vor%     
Vit Bernatik 12.12.2011 12:02
quelle

Tags und Links