LoadLibrary("a.exe");
-
HMODULE WINAPI LoadLibrary( __in LPCTSTR lpFileName ); Parameters lpFileName [in] The name of the module. This can be either a library module (a .dll file) or an executable module (an .exe file). The name specified is the file name of the module and is not related to the name stored in the library module itself, as specified by the LIBRARY keyword in the module-definition (.def) file.extern "C" __declspec(dllexport) void EntryFunc() { }Ich habe mal probiert, mit LoadLibrary eine Exe-Datei anstelle einer DLL zu laden, was zunächst problemlos funktionierte.
Man erhält ein HMODULE zurück und hat per GetProcAddress Zugriff auf die exportierten Funktionen und kann diese aufrufen, so als wäre eine DLL statt einer EXE-Datei geladen.Mein Problem: Ich rufe aus dem Ursprungsprozess remote die Funktion "EntryFunc" auf und dort kann ich keine WinAPI-Funktionen verwenden, sonst verabschiedet sich direkt der Prozess. Mit einer DLL, die aus dem gleichen Code (plus DllMain) kompiliert wird, klappt es.
Habe schon Google bemüht und herausgefunden, dass die Base Address der per LoadLibrary geladenen Executable eine andere ist, als wenn die Executable den Prozess selbst bildet. Daher erhalte ich beim Aufrufen fremder Funktionen einen Laufzeitfehler. Und dass ich eine Relocation Table brauche und dass ich das in den Linker-Optionen finde.
Habe nun inkrementelles Linking abgeschaltet und eine Relocation Table erzwungen:Umsetzungsabschnitt generieren (/FIXED:NO)Aber leider hat sich nichts geändert.
Habe ich etwas offentliches übersehen, eine bestimmte Linker-Option? Oder muss ich mich nun durch PE-Header-Dokus wühlen?
Ich benutze übrigens VC++2008 auf Windows XP SP3.
Hoffe um Antwort
-
was soll diese schwachsinnige frickelei?
-
Hast du auch etwas konstruktives beizutragen?
Der MSDN zufolge gibt es keine weiteren Einschränkungen beim Benutzen von Executables als Plugins, also ist entweder die Doku unvollständig oder ich mache etwas falsch. Das zu klären ist Sinn des Threads, oder?
-
Was hast Du vor mit dem LoadLibrary der EXE?
Man kann eine andere EXE nicht in einen Prozess einer laufendnen EXE hineinladen.
Das macht auch keinen Sinn.Man kann sicherlich sich das bestehende Handle (HINSTANCE) der aktuelen EXE besorgen und per GetProcAddr einen Einsprung Punkt suchen. Aber warum solte man so etwas wollen?
Man kann ja Calbacks per Funktions Aufruf übergeben.Deine Anfrage macht mir keinen Sinn. Insofern kann ich den Kommentar von asdca verstehen

-
Der Sinn ist ein Plugin, das erstens ein Icon besitzt und zweitens per Doppelklick im Explorer startbar ist und das sich selbstständig in das plugins-Verzeichnis des Hostprogramms kopieren kann und dieses neustartet. Dabei muss es allerdings noch als Plugin verwendbar sein. Sicher wäre auch eine Prozedur zum Entpacken einer DLL-Datei und einer EXE-Datei möglich, aber mir ist eine elegantere Methode lieber. (Außerdem kann ich keinen Entpacker schreiben.)
Dem letzten Post muss ich widersprechen. Eine Executable kann Symbole exportieren und diese lassen sich über LoadLibrary und GetProcAddress aufrufen. Soweit stimmt die MSDN und Google bestätigt das nach einiger Suche.
Ob GetProcAddress mit dem Handle des ausführenden Programms selbst oder mit dem Rückgabewert von LoadLibrary gefüttert wird, sollte keine Rolle spielen.
Wird zweiteres verwendet, stürzt das Programm jedoch ab, sobald in irgendeiner Funktion des Plugins eine API-Funktion aufgerufen wird. Bei der DLL funktioniert das reibungslos, daher liegt es denke ich am Linker, Stichwort Relocation...
-
Es liegt nicht am Linker. Warum auch?
Es liegt daran, dass eine EXE keine DLL ist und keinen entsprechenden Einsprungpunkt hat. Entsprechend wird die CRT nicht initialisiert und gestartet und das wird eben weitere Folgen haben, die einen Crash auslösen.Ich würde eine EXE bauen, die das eigentliche Plugin als Ressource mit sich führt und dann installiert...
Dazu gibt es genug Anhaltspunkte hier im Forum und dazu muss man keinen "Entpacker" schreiben.
-
Ok... habe herausgefunden, dass ein Flag im PE-Header der Datei gesetzt werden muss, damit diese von Windows wie eine DLL geladen werden kann. Dann ist sie aber nicht mehr ausführbar. Thread kann geschlossen werden.
