DLL-Export einer Funktion ohne C++ name mangling
-
Ich möchte Funktionen ohne C++ "name mangling" aus einer DLL exportieren.
M$ schreibt dazu:dllexport of a C++ function will expose the function with C++ name mangling. If C++ name mangling is not desired, either use a .def file (EXPORTS keyword) or declare the function as extern "C".
Dachte mir - ist kein Problem. Aber wenn ich laut:
http://www.cpp-tutor.de/cpp/le07/le07_03_d1.htm
extern "C" benutze:#ifdef D5SCAN_EXPORTS #define D5SCAN_API __declspec(dllexport) __stdcall #else #define D5SCAN_API __declspec(dllimport) __stdcall #endif #ifdef __cplusplus extern "C" { #endif // Die exportierten Funktionen unsigned int D5SCAN_API InitDLL(PAcqMainParams P); unsigned int D5SCAN_API ImgScan(TImgScanFuncID FuncID, unsigned int *CFuncHandle, void *P1, void **P2); #ifdef __cplusplus } #endifwird aus
EXPORT ord:0001='?ImgScan@@YGIW4_TImgScanFuncID@@PAIPAXPAPAX@Z' EXPORT ord:0002='?InitDLL@@YGIPAUTAcqMainParams@@@Z'EXPORT ord:0001='_ImgScan@16' EXPORT ord:0002='_InitDLL@4'Ich will aber
EXPORT ord:0001='InitDLL' EXPORT ord:0002='ImgScan'1.) Wie kann ich das "name mangling" völlig abschalten?
2.) Wie kann ich die Ordinalzahl für die Funktionen selbst bestimmen?Habe es auch schon mit einer DEF-Datei probiert. Da schaffe ich es aber nicht, die Datei mit ins Visual C++ 2005 Projekt aufzunehmen. Deshalb meine 3. Frage:
3.) Wie bindet man eine DEF-Datei in ein Visual C++ 2005 Prokekt ein?Vielen Dank im Voraus
Bernd
-
was du haben willst geht mit einer .DEF-Datei
einfach ins projekt einbinden mit: Project/Add New Item/Code/Module-Def. File (.def)das geht dann in etwa so (aus dem Gedächtnis heraus; konsulier am besten MSDN, da steht das sicher drin):
EXPORTS FunktionsName @1 FunktionsName2 @2(in der DEF-Datei; ordinalzahl nach dem @)
*edit*
siehe hier: http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/vccore/html/_core_exports.asp
-
Das das _ davorsteht ist doch korrekt ... sollte jeder Compiler so machen ... ist doch C-Style export?!
-
awx schrieb:
was du haben willst geht mit einer .DEF-Datei
einfach ins projekt einbinden mit: Project/Add New Item/Code/Module-Def. File (.def)Danke awk, ich dachte mir schon das es nicht ohne def Datei geht. Der Syntax ist kein Problem. Aber leider gibt es bei der freien Express Edition von Visual C++ 2005 keinen Eintrag für def Dateien. Da M$ voll auf .NET abfährt ist bei der Installation der Express Edition einiges an Handarbeit nötig um überhaupt Win32 Programme erstellen zu können. Nun ist mir klar, dass man in einer der XML-Konfigurationsdateien den Eintrag für def Dateien hinzufügen müsste. Da ich aber unter Zeitdruck stehe habe ich das Problem gelöst, indem ich die def Datei manuell ins Projekt eingebunden habe. Für alle die auch an der Lösung interessiert sind:
1.) Das Projekt links im "Solution Explorer" anwählen
2.) Im Menü mit "Project | Properties... Alt+F7" den "Property" Dialog öffnen und dort auf der linken Seite in der Baumansicht "Configuration Properties | Linker | Input" anwählen.
3.) Oben, links in der "Configuration:" Dropdown-Liste "All Configurations" anwählen.
4.) In der rechten Liste in der Zeile "Module Definition File" die def Datei eintragen.Das entspricht der Kommandozeilenoption "/DEF:name".
(D)Evil schrieb:
Das das _ davorsteht ist doch korrekt ... sollte jeder Compiler so machen ... ist doch C-Style export?!
Nein, das macht nicht jeder C/C++ - Compiler so. Das vom Compiler erzeugte Binärformat ist nicht genormt. Jeder Hersteller kann da seine eigenen Konventionen einführen. Das ist aber hier nicht relevant, da ich meine DLL sowieso sprachunabhängig halten will.