![]() |
Exe in Resource einfügen und im Programm lokal laden
Huhu!
Ich möchte mehrere Exe-Dateien in eine *.RES datei packen und später in meinem Delphi-Anwendung (während der Laufzeit) diese Exe aus der laufenden Exe heraus starten. Ist soetwas möglich? 1. wie muss dann die *.rc Datei aussehen, damit ich EXE'n einbinden kann? 2. wie kann ich denn aus dem Programm eine exe aus der Ressource aufrufen/laden? (mit parameter) |
Re: Exe in Resource einfügen und im Programm lokal laden
Eintrag in der RC-Datei könnte so aussehen (ob PRELOAD OK ist, weis ich aber auch nicht, verwende ich immer für meine eingebundenen Ressourcen ;) :
Code:
Aus der Ressource wieder als Datei speichern:
MYPROGRAM1 RCDATA PRELOAD irgendeinprogramm.exe
Delphi-Quellcode:
Am besten im Temp-Ordner von Windows speichern und von dort mit ShellExecute und den entsprechenden Parametern aufrufen.
ResStream := TResourceStream.Create(hinstance,'MYPROGRAM1',RT_RCDATA);
ResStream.SaveToFile('irgendeinprogramm.exe'); Du willst es wahrscheinlich nicht zwischenspeichern, aber dazu hab' ich keine Ahnung. |
Re: Exe in Resource einfügen und im Programm lokal laden
Hallo
Ich habe vor einigen Jahren mal diese Anleitung geschrieben: 1. Starte Notepad und erstelle ein .rc-file, das etwa so aussieht: TESTFILE EXEFILE C:\Windows\Notepad.exe (Stelle sicher, dass der Pfad zur Exe-Datei korrekt ist!) 2. Speichere es als myres.rc 3. Kompiliere die Datei mit brcc32.exe (Im Delphi-bin Verzeichnis) um die Datei myres.res zu erhalten. 4. Kopiere myres.res in das entsprechende Projekt-Verzeichnis. 5. In der unit, schreibe etwa das folgende:
Delphi-Quellcode:
var
Form1: TForm1; NOTEPAD_FILE: string; implementation {$R *.DFM} {$R MYRES.RES} function GetTempDir: string; var Buffer: array[0..MAX_PATH] of Char; begin GetTempPath(SizeOf(Buffer) - 1, Buffer); Result := StrPas(Buffer); end; // Ressource extrahieren function ExtractRes(ResType, ResName, ResNewName: string): Boolean; var Res: TResourceStream; begin Result := False; Res := TResourceStream.Create(Hinstance, Resname, PChar(ResType)); try Res.SavetoFile(ResNewName); Result := True; finally Res.Free; end; end; // Datei ausführen procedure ShellExecute_AndWait(FileName: string); var exInfo: TShellExecuteInfo; Ph: DWORD; begin FillChar(exInfo, SizeOf(exInfo), 0); with exInfo do begin cbSize := SizeOf(exInfo); fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT; Wnd := GetActiveWindow(); ExInfo.lpVerb := 'open'; lpFile := PChar(FileName); nShow := SW_SHOWNORMAL; end; if ShellExecuteEx(@exInfo) then Ph := exInfo.HProcess else begin ShowMessage(SysErrorMessage(GetLastError)); Exit; end; while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do Application.ProcessMessages; CloseHandle(Ph); end; // Testen: procedure TForm1.Button1Click(Sender: TObject); begin if ExtractRes('EXEFILE', 'TESTFILE', NOTEPAD_FILE) then if FileExists(NOTEPAD_FILE) then begin ShellExecute_AndWait(NOTEPAD_FILE); ShowMessage('Notepad beendet!'); DeleteFile(NOTEPAD_FILE); end; end; procedure TForm1.FormCreate(Sender: TObject); begin NOTEPAD_FILE := GetTempDir + 'Notepad_FROM_RES.EXE'; end; |
Re: Exe in Resource einfügen und im Programm lokal laden
Moin, Moin.
Vorgehensweise ist mir verständlich. Aber: Wozu soll das gut sein? Um sicherzustellen, dass die Programme NUR durch die Delphi-Anwendung gestartet werden können? Kann man die einzelnen Programme nicht mit Hilfe anderer Software wieder aus der Ressource extrahieren? |
Re: Exe in Resource einfügen und im Programm lokal laden
Also ich hatte es verwendet, um einen benötigten TrueType-Font und ein Standard Formular (als Textdatei) mit zu geben.
Manchmal will man nur eine einzelne EXE direkt ausführbar weitergeben. |
Re: Exe in Resource einfügen und im Programm lokal laden
Zitat:
|
Re: Exe in Resource einfügen und im Programm lokal laden
Das geht bzw. ging es noch unter XP. Allerdings ist es ungleich aufwendiger. Und wozu soll das gut sein?
Beispiel gibt es von Nico: ![]() |
Re: Exe in Resource einfügen und im Programm lokal laden
klar kann man die Resourcen mit anderen Programmen extrahieren :angel:
und dieses Vorgehen hat auch noch einen Nachteil ... wenn das Programm keine Rechte hat, um in seinem Verzeichnis eine Datei zu erstellen und auszuführen. |
Re: Exe in Resource einfügen und im Programm lokal laden
Zitat:
|
Re: Exe in Resource einfügen und im Programm lokal laden
OOOOOOKAY ^^ überredet ich nehm doch die TEMP methode ^^
wie muss ich das denn dann aufrufen?
Delphi-Quellcode:
oder wie?
ExtractRes('EXEFILE', 'MYRES', 'C:\...\meineExe.exe')
|
Re: Exe in Resource einfügen und im Programm lokal laden
Zitat:
Grüße Klaus |
Re: Exe in Resource einfügen und im Programm lokal laden
na, analog des Beispiels
Delphi-Quellcode:
hier wird der 3te Parameter "zusammengebaut"
NOTEPAD_FILE := GetTempDir + 'Notepad_FROM_RES.EXE';
|
Re: Exe in Resource einfügen und im Programm lokal laden
OOOOOKAY ich glaub cih geh jetzt vom Coumuter ... ich verpeil ja heut alles XD
und DANKESCHÖÖÖÖÖÖN !!! :cheers: |
Re: Exe in Resource einfügen und im Programm lokal laden
Das ist manchmal eine weise Entscheidung!
Morgen geht's bestimmt wieder besser von der Hand. :thumb: |
Re: Exe in Resource einfügen und im Programm lokal laden
Delphi-Quellcode:
Kann man nicht auch
TESTFILE EXEFILE C:\Windows\Notepad.exe
Delphi-Quellcode:
nehmen?
TESTFILE BIN C:\Windows\Notepad.exe
|
Re: Exe in Resource einfügen und im Programm lokal laden
Wie du siehst
Zitat:
Zitat:
Bei dir also... Zitat:
|
Re: Exe in Resource einfügen und im Programm lokal laden
Zitat:
Die betreffenden Units mit Delphi übersetzen scheidet wegen einiger wesentlicher Inkompatibilitäten syntaktischer Natur ebenfalls aus. Zitat:
Aber das hängt vom Wert der zu schützenden Software ab. Die Vorgehensweise ist mir auch klar. Aber warum muss ich, wenn ich eine Ressource extrahieren will, diese speichern? Muss ich sie dann nicht vielmehr lesen?
Delphi-Quellcode:
function ExtractRes(ResType, ResName, ResNewName: string): Boolean;
var Res: TResourceStream; begin Result := False; Res := TResourceStream.Create(Hinstance, Resname, PChar(ResType)); try Res.SavetoFile(ResNewName); Result := True; finally Res.Free; end; end; |
Re: Exe in Resource einfügen und im Programm lokal laden
bei mir funktioniert irgendwie keiner dieser varianten... ausser *.exe, schafe ich alle dateien einzubinden nur zur *.exe einbindung / Ausführung find ich keine hilfe... hmmm...
|
Re: Exe in Resource einfügen und im Programm lokal laden
Zitat:
weiss einer en vorschlag |
Re: Exe in Resource einfügen und im Programm lokal laden
Was heißt er kennt ResStream nicht? Hast du die Variable auch irgendwo deklariert? Lass das PRELOAD mal weg. Wird das Ressourcenscript denn auch richtig compiliert?
Desweiteren wäre es wünschenswert, wenn du etwas auf korrektes Deutsch achten würdest in deinen Beiträgen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz