[MINGW] DLL, Call convention, exportierte Fkt-Namen

mfernau

Mitglied
Hallo Leute,

ich bin gerade dabei mich in c++ einzufummeln. Für ein kleines Projekt muss ich eine DLL erstellen die von einem Cobol-Programm heraus aufgerufen werden soll. Nun habe ich nach stundenlanger Fehlersuche (weil es natürlich nicht out-of-the-box funktionierte) und einem DLL-Inspektor Programm festgestellt, das die exportierten Funktionsnamen meiner DLL durch diverse Zahlen und Buchstaben ergänzt wurden.

Beispiel:
int test3(const char*, char*)
wurde zu:
_Z5test3PKcPc

Meine Vermutung liegt nun darin, dass dies am Polymorphismus von c++ liegt. Also der Möglichkeit, Methoden mit demselben Namen, aber unterschiedlichen Parametern zu definieren. Das muss man nach außen hin natürlich unterscheiden.

Meine Frage ist nun: Liege ich damit richtig und muss mir anhand eines DLL-Inspektors den echten Namen der Funktion ermitteln (damit Cobol weiß wie die Funktion nun wirklich heisst), oder gibt es Mittel und Wege diese Exportierung zu beeinflussen sodass das Cobol-Programm einfach nur test3 anstatt Z5test3PKcPc aufrufen kann?
Dazu ein kurzer Ausschnitt aus der Beschreibung des Cobol-Compilers, wie man C++ DLLs einbindet
...ACUCOBOL-GT® provides several robust methods for interoperating with C programs. These technologies work equally well with C++ programs that conform to C calling conventions
Stichwort dabei: "C calling conventions"

Gruß,
Martin
 
Hallo,

der Mechanismus auf den du gestoßen bist nennt sich "name mangeling"...
Was du machen könntest:
Es gibt in C++ eine Speicherklasse namens extern "C". Dieses Konstrukt weißt den Kompiler an, aus C++ Funktionen Funktionsnamen im Objectcode zu generieren welche sich wie C Funktionsnamen verhalten, schaltet also das name mangeling aus. Wenn du also sagst:

C++:
#ifdef __cplusplus /* extern "C" kennt nur ein C++ Compiler */
extern "C"
{
#endif
  int test3(const char*, char*);
#ifdef __cplusplus
}
#endif
generiert der Compiler Objectcode welcher die Symbolnamen in C- Manier enthält

Falls du Funktionen aus Klassen benutzt müsstest du also einen Wrapper davorschalten, der extern "C" Funktionen besitzt und dann aus diesen deine Klassenmethoden aufruft.

HTH,
RedWing
 
Na super! Das ist doch mal eine Klasse Erklärung! Mit dem
Code:
extern "C"
klappt es dann auch ohne das ich in Cobol diesen komplizierten Funktionsnamen verwenden muss.
Vielen Dank!
 
Zurück