2016-08-24 1 views
6

Ist es möglich, dass eine Datei gleichzeitig eine ausführbare Datei (EXE) und eine Dynamic Link Library (DLL) ist? (z. B. kann es als eine EXE ausgeführt und zur Laufzeit als eine gemeinsame Bibliothek geladen werden.)Kann eine Datei gleichzeitig eine ausführbare Datei (EXE) und eine Dynamic Link Library (DLL) sein?

Ich kann nicht sehen, warum es nicht möglich sein sollte, aber vielleicht kann jemand eine Erklärung geben?

+1

Es kann nicht. Siehe das folgende: http://StackOverflow.com/Questions/1210873/Difference-between-Dll-and-Exe –

+0

Related: http://StackOverflow.com/Questions/19110747/loadlibrary-an-Exe –

+0

Nicht ein Experte , also werde ich nur zwei Dinge hinzufügen, die ich beachten sollte: 1) zwei Haupteinstiegspunkte (exe vs dll haben unterschiedliche). 2) DLL-Basisadresse ist nicht festgelegt, so dass Ihr "DLL" -Code "positionsunabhängiger Code" sein muss.Es gibt sicher noch viel mehr Dinge, um den Dateiinhalt richtig zu machen, um alle erforderlichen Abschnitte zu haben, etc .. Sieht aus wie Samis Kommentar hat ein nettes Tutorial, wie man es macht. Ich würde diese Mischung aus Wartungsgründen vermeiden (MS wird es eines Tages brechen, ich wette :)). Aber es sieht möglich aus, wenn Sie darauf bestehen. – Ped7g

Antwort

7

Von LoadLibrary Dokumentation:

Der Name des Moduls. Dies kann entweder ein Bibliothekmodul (eine DLL-Datei) oder ein ausführbares Modul (eine EXE-Datei) sein. Der angegebene Name ist der Dateiname des Moduls und bezieht sich nicht auf den Namen, der im Bibliothekmodul selbst gespeichert ist, wie im Schlüsselwort LIBRARY in der Moduldefinitionsdatei (.def) angegeben.

EDIT: Ich erwartete downvotes, als ich diese Antwort schrieb. Ich weiß, dass viele Leute denken, dass es nicht möglich ist (SO Fragen und Antworten aus Kommentaren bestätigen es). Aber für diejenigen, die interessiert sind, kann ich POC (oder einfach nur gut bekannte "Process Explorer" Quellen)

Beachten Sie, dass, wenn Sie Symbole aus dem Modul exportieren müssen Sie diese EXPORT-Anweisungen in .def Datei verwenden. Dann können Sie GetProcAddress

Eigentlich verwenden, sehe ich, dass dieser SO question, auch in den Kommentaren erwähnt, hat Antwort, die Artikel weist "Load EXE as DLL: Mission Possible", die ich auch zitieren würde. Diese Antwort wird nicht akzeptiert, akzeptierte Antwort sagt "Nein" und wird sogar als Community-Wiki verwendet. Nun "SO doesn't claim to be (in part) a library reference"

+0

Ähm, der Artikel zeigt im Grunde, wie man die zusätzliche Arbeit machen kann, die LoadLibrary * für DLLs nicht leistet . Es zeigt nicht, wie etwas sowohl eine EXE als auch eine DLL sein kann, es zeigt, wie man durch zusätzliche Ringe springen kann, damit eine DLL wie eine EXE funktioniert. Natürlich ist das möglich, Sie schreiben einfach den gleichen Code wie Microsoft im Loader. Ich weiß nicht, was Sie unter "Process Explorer Quellen" verstehen. Haben Sie den Quellcode für Process Explorer? Wie ist es relevant für dieses Problem? –

+0

Außerdem vermute ich den wahren Grund, warum die LoadLibrary-Funktionsdokumentation dies als historisch bezeichnet. In den 16-Bit-Tagen war die DLL-Erweiterung nicht weit verbreitet (in Windows 1.0 existierte sie natürlich nicht einmal). Alle Code-enthaltenden Binärdateien hatten die Dateierweiterung EXE, einschließlich KRNL386.EXE, USER.EXE, GDI.EXE usw. Aber das waren nur DLLs, wie wir sie jetzt kennen. Ein einzelnes Bit im PE-Header bestimmte, wie sie geladen werden sollten. Die Dokumentation wurde wahrscheinlich nie aktualisiert, und Rückwärtskompatibilität bedeutet, dass der Code auch nicht vorhanden war. Außerdem können Ressourcen auf diese Weise von einer EXE geladen werden. –

+1

@CodyGray: Ich denke nicht, dass das richtig ist. DLLs kommen mit allen möglichen Erweiterungen (zB .ocx) und selbst eine .exe muss nicht mit .exe enden. –

2

In der offiziellen PE Dokumentation, IMAGE_FILE_EXECUTABLE_IMAGE (0x002) und IMAGE_FILE_DLL (0x2000) sind beide Flaggen des Characteristics Bereichs der PE-Header.

Wie in der IMAGE_FILE_DLL (0x2000) gesehen: Datei

Das Bild ist eine Dynamic Link Library (DLL). Solche Dateien sind als ausführbare Dateien für fast alle Zwecke betrachtet, obwohl sie nicht direkt ausgeführt werden können.

jedoch für IMAGE_FILE_EXECUTABLE_IMAGE (0x002):

Nur Bild. Dies zeigt an, dass die Image-Datei gültig ist und ausgeführt werden kann. Wenn dieses Flag nicht gesetzt ist, zeigt es einen Linker-Fehler an.

Da die DLL nicht direkt ausgeführt werden kann, darf sie nicht das Flag IMAGE_FILE_EXECUTABLE_IMAGE (0x002) gesetzt haben.

Ich denke, dass diese OR-Flags zu einem Fehler bei der Ladezeit führen würden, aber ich bin mir nicht sicher.

Verwandte Themen