2009-01-25 7 views
9

In Visual C++, wenn ich eine DLL erstellen, sind die Ausgabedateien .dll und .lib.Beim Erstellen einer DLL-Datei enthält die generierte LIB-Datei den DLL-Namen?

Der Name der DLL ist in die .lib-Datei integriert.

Die Reasson Ich stelle diese Frage ist: Wenn ich meine Exe durch Importieren dieser DLL und Ausführen der Exe, versucht die EXE versucht, die DLL zu finden, um es in den Prozess Adressraum zu laden.

Da wir nur den Bibliotheksnamen (.lib-Datei) in den Projekteigenschaften angeben, wie lernt die Exe den Namen der DLL kennen.

Hinweis: Ich dumpbin Bibliotheksdatei (.lib) und sah, dass es nicht den Namen der DLL enthält.

Antwort

15

Die LIB-Datei wird in der EXE in eine Importtabelle umgewandelt. Diese enthält enthält den Namen der DLL.

Sie können dies sehen, wenn Sie dumpbin /all MyDLL.lib ausführen. Beachten Sie, dass dumpbin MyDll.lib an sich nichts Nützliches zeigt: Sie sollten /all verwenden.

Dies zeigt alle in der LIB-Datei definierten Abschnitte an. Sie können alle Abschnitte .debug ignorieren, da sie in einem Release-Build nicht vorhanden wären. In der LIB-Datei gibt es eine Sammlung von IDA-Abschnitten. Im DLL-Projekt, das ich die LIB-Datei enthält nur gebaut, einen .idata$4 Abschnitt, der die Symbole definiert in der Importtabelle der EXE gestellt werden, einschließlich dem DLL-Name:

Archive member name at 83E: MyDll.dll/  
497C3B9F time/date Sun Jan 25 10:14:55 2009 
     uid 
     gid 
     0 mode 
     2E size 
correct header end 

    Version  : 0 
    Machine  : 14C (x86) 
    TimeDateStamp: 497C3B9F Sun Jan 25 10:14:55 2009 
    SizeOfData : 0000001A 
    DLL name  : MyDll.dll 
    Symbol name : [email protected]@YAHXZ (int __cdecl fnMyDll(void)) 
    Type   : code 
    Name type : name 
    Hint   : 2 
    Name   : [email protected]@YAHXZ
+0

ja die Exe-Import-Sektion enthält den Namen der DLL. Aber es lernt den Namen aus der Bibliothek wie du sagst. Meinst du, die Bibliothek enthält den Namen? Wenn ja, warum sehe ich das nicht, wenn ich die Bibliothek entblößt habe? –

+0

... weil Sie DUMPBIN nicht korrekt ausführen? Übergeben Sie den Schalter/ALL, und dann sollten Sie eine Ausgabe sehen, die der von mir beinhalteten ähnlich ist. –

+0

Danke. Ich verstehe jetzt das Konzept. –

2

Ja, enthält die lib den Namen der DLL.

Funktional implementiert die Importbibliothek die Aufrufe LoadLibrary und GetProcAdress und stellt die exportierten Funktionen bereit, als wenn sie statisch verknüpft wären.

Der Suchpfad ist der gleiche wie für LoadLibrary dokumentiert, der Name ist jedoch festgelegt.

0

Wie von Roger und Peter hervorgehoben, enthält die .lib-Datei den Namen der .dll-Datei. Und dank Roger, der darauf hinweist, dass dumpbin den Namen der .dll-Datei anzeigt, half mir das, mein Problem zu lösen. Dies bezieht sich darauf, woher der Name in der .lib-Datei stammt.

Ich erwartete, dass der Name aus den Projekteinstellungen für das DLL-Projekt übernommen wurde, aber wir hatten eine export.def, die den Namen für die DLL angegeben. Also hatten wir Probleme mit unserer DLL, wenn ich die Projekteinstellungen änderte, aber nicht die export.def. Die Lösung für unser Projekt war das Löschen der Datei export.def.

Verwandte Themen