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
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.
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.
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.