professionelle Dynamik-Link-Library’s haben Klartextfunktionen, die man mit dumpbin –exports „file.dll“ anzeigen lassen kann. Nun wollte ich mal versuchsweise selber so ein DLL schreiben und habe dazu als Basis das Beispiel http://msdn.microsoft.com/en-us/library/ms235636(v=vs.80).aspx
verwendet. Ich bin zur Erstellung des Dll exakt so vorgegangen, wie in dem Beispiel beschrieben und verwendete Visual Studio 2008.
Der Exportmechanismus funktioniert auf der Basis von __declspec(export) mit dem Ergebnis, dass lediglich „decorated function“ Bezeichnungen entstehen.
Ich möchte erreichen, dass exportierte Funktionen einen Klartextnamen aufweisen, der am besten dem originalen Funktionsname, so wie er in dem Dll programmiert ist, entspricht.
Meine vorrausgegangene Netzrecherche hat ergeben, dass dieses Ziel mit dem Schlüsselwort extern „C“ erreicht werden könnte. Leider funktioniert dies nicht in meiner Dll:
*****************************mathfuncdll\mathfuncdll.h(9) : error C2059: Syntaxfehler: 'Zeichenfolge'
In der M$ Dokumentation (http://msdn.microsoft.com/de-de/library/a90k134d(v=vs.80).aspx) sind andere Möglichkeiten beschrieben, wie Funktionen aus einem dll exportiert werden können – sollte ich eine Vorgehensweise auf der Basis „.def“ verwenden ? Ich habe auch schon im Forum gesucht, leider hat mir der Beitrag: http://www.c-plusplus.de/forum/111381?highlight=decorated
nicht weitergeholfen .
also wie es aussieht sollte muss man ein .def File anlegen, um den decorated name zu vermeiden – ich habe das gerade mal ausprobiert und siehe da – der Name der exportierten Funktion erschien als Klartext. Diese Klartextfunktion konnte ich auch in einer anderen Anwendung verwenden.
Nun ist es jedoch so, das mit dumpbin –exports „file.dll“ der Klartextname gezeigt wird und dahinter func = decorated func- name erscheint. Dies ist zwar nur ein Schönheitsfehler – aber ich hätte gern nur den Klartextnamen angezeigt.
Entsprechend diverser Hinweise aus dem Netz diesbezüglich habe ich auf „Release Modus“ umgestellt – jedoch brachte dies nicht den gewünschten Effekt. Vielleicht weiß ja jemand, wie man den decorated name vollständig unterdrückt
Hallo Martin Richter,
vielen Dank für den Hinweis – ich habe mal versucht, die in Ihrem Blog skizzierte Herangehensweise nachzuvollziehen. Leider habe ich vermutlich etwas nicht verstanden, denn es gibt folgende Fehlermeldung:
MathfuncDll.obj : fatal error LNK1276: Ungültige =-Direktive gefunden. Sie beginnt nicht mit "/".
Wie in dem Blog skizziert habe ich zunächst die zu exportierende Funktion folgendermaßen definiert (ich bin immer noch bei dem anfangs zitierten M$ Beispiel)
Klasse:
Ich habe anschließend, wie im Blog skizziert, den decorated name per copy &paste entnommen und in die pragma zeile eingefügt und die __declspec(dllexport) Anweisung in der Klasse sowie vor der Funktionsdeklartion entfernt.
C/C++ Code:
#pragma comment(linker, "/EXPORT:Add = ?Add@MyMathFuncs@MathFuncs@@QAENNN@Z")
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
C/C++ Code:
#pragma comment(linker, "/EXPORT:Add = ?Add@MyMathFuncs@MathFuncs@@QAENNN@Z")
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
C/C++ Code:
#pragma comment(linker, "/EXPORT:Add = ?Add@MyMathFuncs@MathFuncs@@QAENNN@Z")
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
Eine nichtstatische Memberfunktion als extern "C"? Würde mich wundern, wenn das geht. Der primäre Zweck von extern "C" ist nicht, die Namen aufzuhübschen, sondern ein Symbol von einem in C geschriebenen Modul aus zugänglich zu machen. C kann aber keine Memberfunktionen aufrufen, also sollte extern "C" in dem Fall keine Wirkung haben. Versuch es mal mit einer freien Funktion oder wenigstens mit einer statischen Memberfunktion.
wie es aussieht hatte ich ein Leerzeichen zu viel - so funktioniert es nun:
C/C++ Code:
#pragma comment(linker, "/export:Add=?Add@MyMathFuncs@MathFuncs@@QAENNN@Z")
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
C/C++ Code:
#pragma comment(linker, "/export:Add=?Add@MyMathFuncs@MathFuncs@@QAENNN@Z")
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
C/C++ Code:
#pragma comment(linker, "/export:Add=?Add@MyMathFuncs@MathFuncs@@QAENNN@Z")
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
Leider enthält das das dumpbin – exports „file.dll“ Ergebnis immer noch einen Verweis auf die kryptische Funktionsbezeichnung (genau wie bei der def -Datei Vorgehensweise):
ich habe mal ein wenig mit Deiner Methode weiter herumexperimentiert und bin durch Zufall auf den „Punkt“ gekommen:
C/C++ Code:
#pragma comment(linker, "/export:Add=..")
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
C/C++ Code:
#pragma comment(linker, "/export:Add=..")
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
C/C++ Code:
#pragma comment(linker, "/export:Add=..")
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
Ich habe zwar keine Ahnung, was diese Option bewirkt, aber die Funktion kann ich trotzdem mit einer anderen Anwendung, in die das Dll eingebunden habe laden und benutzen.
dumpbin –exports „file.dll“ liefert nun: 4 0 Add (forwarded to ..)
Zumindest ist dieser kryptische Name hinter dem “=” verschwunden – nur das “Add” jetzt zu „.“ weitergeleitet wurde. Es muss doch irgendetwas geben, um sämtliche Zusatzinformation gänzlich zu unterdrücken, so dass einfach nur dasteht: Add – meinetwegen auch: 4 0 Add.
MFG
Deine Variante ist doch perfekt – ich habe jetzt noch diesen Beitrag: http://stackoverflow.com/questions/2804893/c-dll-export-decorated-mangled-names
berücksichtigt (Projekt- Eigenschaftenseiten-> Linker->Debugging -> Debuginfo generieren -> Nein).
Jetzt ist alles so wie ich es haben wollte. Ich habe auch nochmal die Variante mit der Def- Datei getestet – auch in diesem Fall kann die „zusätzliche Information“, die mit dumpbin –exports „fill.dll“ ursprünglich im Debug Modus angezeigt wird, unterdrückt werden.
Also vielen Dank für alle Hinweise – ich glaube das Problem ist gelöst.
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.