Forum: Compiler & IDEs W32: Import Lib für eine DLL


von Sigint 112 (sigint)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Helfer (Gast)


Lesenswert?

> 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.

von Sigint 112 (sigint)


Lesenswert?

@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

von Helfer (Gast)


Lesenswert?

> 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.

von Hans (Gast)


Lesenswert?


von Hans (Gast)


Lesenswert?


von Sigint 112 (sigint)


Angehängte Dateien:

Lesenswert?

@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
Noch kein Account? Hier anmelden.