Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Exe in Resource einfügen und im Programm lokal laden (https://www.delphipraxis.net/129856-exe-resource-einfuegen-und-im-programm-lokal-laden.html)

J Kadison 26. Feb 2009 19:26


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)

Satty67 26. Feb 2009 19:35

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:
MYPROGRAM1 RCDATA PRELOAD irgendeinprogramm.exe
Aus der Ressource wieder als Datei speichern:
Delphi-Quellcode:
  ResStream := TResourceStream.Create(hinstance,'MYPROGRAM1',RT_RCDATA);
  ResStream.SaveToFile('irgendeinprogramm.exe');
Am besten im Temp-Ordner von Windows speichern und von dort mit ShellExecute und den entsprechenden Parametern aufrufen.

Du willst es wahrscheinlich nicht zwischenspeichern, aber dazu hab' ich keine Ahnung.

toms 26. Feb 2009 19:37

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;

taaktaak 26. Feb 2009 19:45

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?

Satty67 26. Feb 2009 19:51

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.

J Kadison 26. Feb 2009 19:54

Re: Exe in Resource einfügen und im Programm lokal laden
 
Zitat:

Zitat von toms
Ich habe vor einigen Jahren mal diese Anleitung geschrieben:

Die Anleitung sieht gut aus aaaaber. . . kann ich die jetzt ncoh so verfeinern, dass ich auch nichts mehr in das TEMP verzeichniss speichern muss? also dass GARKEINE dateien angelegt werden? sondern diese nur ausgeführt werden?

Luckie 26. Feb 2009 19:59

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: http://www.michael-puff.de/Developer.../Importe/Nico/ -> inmemexe.zip

himitsu 26. Feb 2009 20:04

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.

toms 26. Feb 2009 20:08

Re: Exe in Resource einfügen und im Programm lokal laden
 
Zitat:

Zitat von himitsu
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.

Darum wird es ja im Temp-Verzeichnis gespeichert :wink:

J Kadison 26. Feb 2009 20:09

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:
ExtractRes('EXEFILE', 'MYRES', 'C:\...\meineExe.exe')
oder wie?


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:00 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz