Klassen mittels .def Datei exportieren
-
Hi!
Ich habe das Problem, dass ich nicht weiß, wie ich Klassen mittels einer .def Datei aus einer dll Datei exportieren kann!Mit dllexport funktioniert es zwar wunderbar, aber ich will nur die Ordinalzahlen exportieren, da es eine wirklich große dll Datei wird. Daher brauche ich eine .def Datei.
Ich habe schon alles Mögliche durchprobiert...
prog.h
class foo { public: int bar(int x); } klasse;prog.cpp
int foo::bar(int x) { return x; }prog.def
LIBRARY prog EXPORTS foo @1 NONAME bar @2 NONAME foo::bar @3 NONAME klasse @4 NONAME klasse.bar @5 NONAME...aber jeder Eintrag bringt den Fehler 'Nichtaufgelöstes externes Symbol'
Ich hoffe, ihr könnt mir helfen
mfg. Dominator
-
Du musst die "decorated names" angeben. Das wiederum macht jeder Compiler etwas anders. Eine Möglichkeit ist zuerst alles mittels "__declspec(dllexport)" zu exportieren, und dir dann mittels "dumpbin dllname.dll /EXPORTS > list.txt" eine Exportliste zu erstellen. Wenns bloss ein paar Funktionen sind kannst du die Namen da einfach rauskopieren, sonst gehst du her und schreibst ein kleines Programm welches das generierte Textfile durchackert und ein .def File daraus erstellt. Dann das "__declspec(dllexport)" wieder wegmachen und das .def File stattdessen verwenden und fertig. Das "__declspec(dllexport)" setzt man üblicherweise mit einem Präprozessormacro vor die Klasse, dann kannst du relativ schnell und einfach wechseln.
Wenn du dann ein schön grosses .def File hast kannst du auch ohne weiteres hergehen und neue Funktionen einfach im Code dazuschreiben. Sobald du die in einem Programm verwendest bekommst du eine schöne Linker-Fehlermeldung, da steht auch der decorated name drinnen, den brauchst du nur kopieren und ins .def File mit aufnehmen.
Im allgemeinen würde ich aber davon abraten, es sei denn du musst um jeden Preis die Exportnamen "geheim halten". Selbst bei tausenden importierten Symbolen ist die Ladezeit nicht viel länger wenn nach Namen gelinkt wird, und die Filegrösse ... ist sowieso meistens egal. Zugegeben, bei vielen kleinen Funktionen mit tief geschalchtelten Namespaces und langen Bezeichnernamen kann es einen deutlichen Unterschied machen. Andrerseits musst du dann sehr gut aufpassen dass nicht verschiedene Versionen gemischt werden -- eine Nummer ist nunmal nur eine Nummer, ob dahinter dann auch die richtige Funktion steht kann der Loader nicht wissen.
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Danke Plotzenhotz, hat wunderbar funktioniert!
Nur leider ändern sich die "decorated names" jedes mal, wenn ich an den Klassen etwas verändere.
Es ist etwas umständlich, jedesmal die aktuellen "decorated names" zu bekommen...Naja, ich werde mir wohl ein kleines DEF-Generator-Tool basteln müssen

-
Ich würde diesen Weg gar nicht gehen.
Ich würde Interface Klassen bauen (wie bei COM), und diese entsprechenden Zeiger aus einer simplen Funktion returnieren. Das ist die einfachste und sauberste Lösung.