LoadLibrary () eine EXE?

9

Ich habe eine ausführbare Datei (die ich mit Visual C ++ 10 erstellt habe), und ich muss ihre Fähigkeiten von einem anderen Programm verwenden, das ich geschrieben habe (gleiche Umgebung). Aufgrund komplexer Implementierungsanforderungen, auf die ich nicht eingehen werde, kann ich keine DLL aus den erforderlichen Funktionen erstellen und sie nicht in beide Programme laden.

Also ich dachte, dass ich __declspec(dllexport) einige Funktionen in der EXE, und dann LoadLibrary() kann mich GetProcAddress() ihnen lassen.

Offensichtlich ist das nicht möglich, aber als ich anfing, es zu betrachten - es sah machbar aus.

Wenn Sie __declspec(dllexport) in einem EXE-Projekt ausführen, generiert Visual C ++ außerdem eine lib -Datei für dynamisches Linken - Sie müssen also nicht einmal LoadLibrary() verwenden - verknüpfen Sie einfach mit der resultierenden Lib und dem Aufruf die Funktionen.

Leider besteht das Hauptproblem darin, dass Visual C ++, wenn Sie die resultierende Datei als eine EXE deklarieren, den Eintrag "CRTmain" in die resultierende Datei statt der "CRTDLLmain", die eine DLL erhält, einfügt. Wenn Windows (automatisch) LoadLibrary() EXE von Ihrem Hauptprogramm, ruft es nicht den Einstiegspunkt "CRTDLLmain" auf (weil es nicht existiert), die C-Laufzeit für das Modul wird nicht initialisiert und als ein Ergebnis, das alle interessanten Arbeiten (wie die Speicherzuordnung) mit interessanten (*) Laufzeitausnahmen scheitert.

Wie folgt lautet meine Frage: Gibt es eine Möglichkeit, Visual C ++ zu veranlassen, in der resultierenden Datei den Einstiegspunkt "CRTmain" und den Einstiegspunkt "CRTDLLmain" zu erstellen?

(*) "Interessant" wie in einem alten chinesischen Fluch.

    
Guss 01.10.2013, 07:48
quelle

3 Antworten

-1

Die kurze Antwort ist "Nein". Nachdem ich weit und breit gesucht habe, gibt es keine Möglichkeit, VC ++ dazu zu bringen, das zu tun, was ich möchte, und höchstwahrscheinlich auch keinen anderen Compiler.

Das Hauptproblem ist, dass der main() Einstiegspunkt, den die meisten Leute kennen und lieben, nicht der eigentliche Einstiegspunkt in C ++ - Programmdateien ist: Der Compiler muss viele Initialisierungsarbeiten durchführen, um die "C ++ Run Time" -Bibliothek zu erhalten verwendbarer Zustand, sowie Globals, Statiken und dergleichen initialisieren. Diese Initialisierung verwendet in freigegebenen Bibliotheken anderen Code als in ausführbaren Dateien und es gibt keine Möglichkeit, sich wie ein anderer zu verhalten.

Eine Möglichkeit, die möglich ist, besteht darin, die gemeinsam genutzte Funktionalität in eine DLL zu integrieren und die DLL als Ressource in eine speicherprogrammierte Region der ausführbaren Datei zu laden (es gibt mehrere Codebeispiele wie man das mit VC ++ im Stackoverflow und an anderen Stellen im Web macht. Jetzt kann ein anderes Programm dasselbe tun, indem es die DLL aus der ausführbaren Paketdatei lädt.

    
Guss 22.04.2014, 16:05
quelle
7

Ja, das ist möglich.

Ссылка

Die Idee ist a) die IAT zu patchen und b) den CRT vor dem Aufruf Ihrer Exporte aufzurufen.

    
Michael 11.11.2015 20:44
quelle
0

Einfach nein! Das Problem ist, dass die CRT und in der EXE, die Sie laden möchten, einige globale Variablen verwendet. Sie Haupt-EXE macht das gleiche. Wie sollte die Speicherzuweisung funktionieren?

Wenn Sie eine solche Struktur verwenden möchten, müssen Sie eine DLL verwenden, um sich des Multi Threading, der CRT-Initialisierung und all dieser anderen Dinge bewusst zu sein. Du brauchst das!

Aber was ist mit COM-Automatisierung? Wäre es keine einfache Lösung, Ihren Code in einer EXE von einer anderen zu verwenden?

    
xMRi 01.10.2013 08:13
quelle