Forum: PC-Programmierung Frage zu dll


von gast (Gast)


Lesenswert?

Hallo, ich würde gern wissen was der Unterschied zwischen _declspec und 
extern "C"_declspec ist. Ich hab meine DLL mit allen beiden Varianten 
dynamisch eingeladen und konnte keinen Unterschied, abgesehen davon das 
der eine Ausdruck länger ist feststellen.

Grüsse

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

extern "C" deaktiviert das Name-Mangling des Linkers bei der Generierung 
von Symbolnamen.

Wie die Exporte Deiner DLL heißen, kannst Du mit

  dumpbin datei.dll /exports

herausfinden.

von gast (Gast)


Lesenswert?

danke, muss ich gleich mal googlen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

dumpbin ist Bestandteil der MS-Entwicklungsumgebung.

Aktuell zu finden unter Devstudio9\vc\bin

als Arbeitsverzeichnis aber sollte Devstudio9\Common7\IDE verwendet 
werden, da dort einige DLLs sind, ohne die dumpbin nicht funktioniert.

Alternative: Beide Verzeichnisse in %PATH% aufnehmen.

von Peter (Gast)


Lesenswert?

oder mal nach depends.exe suchen.

von gast (Gast)


Lesenswert?

was ist eigentlich der Unterschied zwischen einer statisch verlinkten 
und dynamisch verlinkten dll. ich weiss das man eine dynamisch verlingte 
dll, einladen kann während der Laufzeit eines programmabschnitts und 
danach wieder entladen, auch muss die DLL nicht existieren. Aber wie 
verhält es sich bei einer statischen DLL. Hab da zu leider nichts 
verständliches gefunden. Muss die DLL da schon beim compilieren meines 
Programms (wo die dll eingebunden ist) vorhanden sein. Wäre nett, wenn 
mir das einer sagen könnte

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

DLLs werden immer zur Laufzeit geladen. Allerdings gibt es zwei 
unterschiedliche Mechanismen:

Was Du "statisch gelinkt" nennst, bedeutet, daß der Programmlader des 
Betriebssystems beim Starten des Programmes alle Abhängigkeiten des 
Programmes auflöst und erst bei vollständiger Befriedigung das Programm 
auch wirklich starten lässt.

Diese Abhängigkeiten lassen sich mit depends oder dumpbin anzeigen.

    dumpbin blafusel.exe /imports

Werden die Abhängigkeiten nicht erfüllt, so gibt der Programmlader eine 
entsprechende Fehlermeldung aus:

    "Die Anwendung konnte nicht gestartet werden,
    weil xyz.dll nicht gefunden wurde"

Bei der Programmerstellung werden die so verwendeten DLLs mittels 
sogenannter Importlibraries mit dem Programm verknüpft. Aus 
Programmierersicht entspricht das Verhalten so verwendeter DLLs dem 
tatsächlich statisch gelinkter Funktionen.
Wobei zum Compilieren und Linken nur die Importlibrary, nicht aber die 
DLL vorhanden sein muss.
Zum Laufenlassen des Programmes, was auch das Debuggen mit einschließt, 
muss die DLL aber zwingend vorhanden sein.


Das "dynamische Linken", wie Du es nennst, bedeutet, daß das Programm 
zur Laufzeit mit den Win32-API-Funktionen LoadModule und 
GetProcAddress arbeitet. Zunächst wird die DLL mit LoadModule 
geladen, dann werden Funktionspointer auf darin enthaltene Funktionen 
mit GetProcAddress bestimmt.

Das ist zwar von der Programmierung her erheblich aufwendiger als das 
einfache #include einer Headerdatei und Linken einer Importlibrary, 
bietet aber erheblich feinere Möglichkeiten der Fehlerbehandlung.

Ein so aufgebautes Programm funktioniert prinzipiell auch, wenn die DLL 
nicht vorhanden ist. Es kann ein intelligentes Versionsmanagement 
implementiert werden; ist die Funktion A vorhanden, aber nicht B, wird 
halt nur A verwendet.

von Peter (Gast)


Lesenswert?

nein eine Statische dll muss immer zur laufzeit vorhanden sein. Beim 
Compilieren braucht man nur die lib.
Wenn die DLL beim starten nicht vorhanden ist, kommt meist eine 
ordentliche Meldung welche DLL vermisst wird.

Das Arbeiten mit dynamisch Dll ist ein wenig Komplizierter weil du das 
Laden und suchen der Funktionen selber machen musst.

von zwieblum (Gast)


Lesenswert?

es gibt keine statische dll. dll = dynamic link library

eine statische library wird beim linken teil der exe, deshalb statisch 
weil nicht austauschbar :-)

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.