Hallo zusammen, ich programmiere mit GCC unter Cygwin/MinGW und habe nun ein kleines Problem. [jaa, Windows ist mein Problem... bitte keine Kommentare dazu X) ] Ich möchte eine DLL nutzen und benötige für dlltool eine .def Datei mit den Exports der DLL. Dafür hab ich irgendwo tiny_impdef gefunden, was auch ganz gut funktioniert. Nur leider liefert tiny_impdef nicht die Ordinals mit. (bin mir nicht sicher, ob ich das richtige meine) Meine def sieht so aus: LIBRARY bass.dll EXPORTS BASS_Apply3D BASS_ChannelBytes2Seconds BASS_ChannelFlags Ich benötige aber folgendes: LIBRARY bass.dll EXPORTS BASS_Apply3D@4 BASS_ChannelBytes2Seconds@0 BASS_ChannelFlags@20 Die Zahl hinter dem @ gibt wohl die Anzahl der Argumente der Funktion an. Mit welchem Tool kann ich die def-Datei für dlltool erstellen, ohne nochmal Hand anlegen zu müssen? "nm" kann die DLL leider nicht bearbeiten... das funktioniert also nicht. Schonmal Danke für euere Tipps. Gruß, SIGINT
Die hinter den Klammeraffen stehenden Nummern sind keine Ordinale. Das ist, wie Du auch richtig vermutet hast, eine Angabe über die zu übergebenden Argumente. Es gibt DLLs, bei denen das so codiert ist, das muss aber nicht so sein. Dieses Format ist eine abgeschwächte Form des vom C++ her bekannten "name mangling". Wenn aber die in der DLL gespeicherten Exportnamen nicht in diesem Format vorliegen, dann kannst Du da nichts machen. Warum meinst Du, daß Du dieses spezielle Format benötigst? Geht das Importlibrarybastel-Werkzeug davon aus, daß das so sein muss? Alternativ könntest Du die DLL auch komplett ohne Importlibrary nutzen, durch Nutzung der Win32-API-Funktionen LoadLibrary und GetProcAddress. Das einzige, was Du dann noch wissen musst (aber das musst Du sowieso), ist, wie die Funktionsprototypen der Funktionen aussehen, damit Du Dir korrekte Typen für die von GetProcAddress gelieferten Funktionspointer definieren kannst.
> Wenn aber die in der DLL gespeicherten Exportnamen nicht in diesem > Format vorliegen, dann kannst Du da nichts machen. Du kannst noch versuchen, die Ordinale herauszufinden (Tool zum DLL untersuchen) und in der .DEF Datei ergänzen. Bei nur drei Funktionen ist das ja noch übersichtlich.
1 | LIBRARY bass.dll |
2 | |
3 | EXPORTS |
4 | BASS_Apply3D@4 @1 |
5 | BASS_ChannelBytes2Seconds@0 @2 |
6 | BASS_ChannelFlags@20 @3 |
Bei einer fremden bass.dll bist du u.U. aufgeschmissen, wenn sich die Ordinalen (1,2,3 im Beispiel) z.B. beim Update der DLL ändern. Deshalb finde ich die Methode von Rufus mit LoadLibrary und GetProcAddress eleganter.
@Rufus: Das mit den Ordinalen hab ich durcheinander gebracht. Die bekomme ich mit pexports, aber die Anzahl der Argumente bekomme ich nur von gcc, wenn ich beim Linken die Lib weglasse. Also kann ich die von Hand in die Def-Datei eintragen... anscheinend gibts im Moment auch keine andere Alternative. Die DLL mit LoadLibrary einzubinden ist sehr interesannt, aber mit der Import-Lib geht es schneller... wenn ich die Lib erstmal habe. Mir geht es eigentlich nur darum DLLs zu nutzen, die eigentlich für MSVC gedacht sind. Da gibts ja viele schöne Freeware/OpenSource - Sachen: BASS, SDL, K8055, etc. Ich muss ja nicht alles von den Sourcen übersetzten, wenn ich auch die DLL nutzen kann. @Helfer: Hatte mich vertan: Ich brauche die Ordinale nicht X) Vielen Dank für euere Antworten. Ich werd einfach die Def von Hand bearbeiten. Vielleicht kann ich etwas tricksen; mal testen. Gruß, SIGINT
> Mir geht es eigentlich nur darum DLLs zu nutzen, die eigentlich für *MSVC* > ... > BASS, SDL, K8055, etc. In der Diskussion ab Beitrag "Velleman K8055 und Cygwin GCC..." war das auch ein Thema.
@Helfer: Und täglich grüßt das Murmeltier. Ich sollte öfters programmieren, damit ich die hälfte nicht ständig vergesse. X) @Hans: gendef sah ja wirklich interesannt aus... leider scheint das Tool probleme mit manchen DLLs zu haben. (siehe Anhang)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.