Delphi-PRAXiS

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?

Klaus01 26. Feb 2009 20:13

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

Zitat von J Kadison
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?

siehe Beitrag #2

Grüße
Klaus

taaktaak 26. Feb 2009 20:15

Re: Exe in Resource einfügen und im Programm lokal laden
 
na, analog des Beispiels
Delphi-Quellcode:
NOTEPAD_FILE := GetTempDir + 'Notepad_FROM_RES.EXE';
hier wird der 3te Parameter "zusammengebaut"

J Kadison 26. Feb 2009 20:17

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:

taaktaak 26. Feb 2009 20:18

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:

Micha88 27. Feb 2009 10:31

Re: Exe in Resource einfügen und im Programm lokal laden
 
Delphi-Quellcode:
TESTFILE EXEFILE C:\Windows\Notepad.exe
Kann man nicht auch

Delphi-Quellcode:
TESTFILE BIN C:\Windows\Notepad.exe
nehmen?

Gabberjool 9. Mär 2009 07:46

Re: Exe in Resource einfügen und im Programm lokal laden
 
Wie du siehst

Zitat:

MYPROGRAM1 RCDATA PRELOAD irgendeinprogramm.exe
Zitat:

ResStream := TResourceStream.Create(hinstance,'MYPROGRAM1',RT_R CDATA);
ResStream.SaveToFile('irgendeinprogramm.exe');
ist es egal, du musst nur im Code dan die richtigen angeben.
Bei dir also...

Zitat:

ResStream := TResourceStream.Create(hinstance,'TESTFILE',BIN);
ResStream.SaveToFile('irgendeinprogramm.exe');

schöni 9. Mär 2009 10:00

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

Zitat von taaktaak
Moin, Moin.
Vorgehensweise ist mir verständlich.
Aber: Wozu soll das gut sein?

Ich sehe auf Anhieb eine Anwendung. Ich hatte mal den Ehrgeiz, den integrierten Debugger aus Lazarus zu extrahieren, um die Schnittstelle zum GDB zu gewinnen, da dieser letzlich augerufen wird. Das Problem war, das ich ein IDE Projekt mit Delphi realisiert hatte, das sich nicht ohne Änderungen auf Lazarus portieren ließ. So wollte ich den Debugger aus Lazarus haben, um ihn in meiner IDE verwenden zu können. Die Schnittstelle in eine Dll packen scheidet aus, da die Debuggerschnittstelle Strings übergibt und die Unit ShareMem bzw. FastMMxxx unbekannt sind. Ich brauche den Debugger also entweder als Stanalone Debugger, der per OLE in die IDE eingebettet werden kann oder die hier angestrebte Lösung, die Exe aus einer Ressource heraus zu starten.

Die betreffenden Units mit Delphi übersetzen scheidet wegen einiger wesentlicher Inkompatibilitäten syntaktischer Natur ebenfalls aus.

Zitat:

Zitat von taaktaak
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?

Schon möglich. Ich denke auch, das diese Vorgehensweise als Programmschutz nicht ausreichend ist.
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;

Gabberjool 10. Mär 2009 08:42

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...

Gabberjool 11. Mär 2009 17:12

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

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

Bei mir sagt der immer das er ResStream ned kennt... ich kirgs mit egal welcher art nicht hin eine normale exe in eine delphi exe zu binden... alle ander dateien kein problem aber exe will der ned nehmen...

weiss einer en vorschlag

Luckie 11. Mär 2009 18:10

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:31 Uhr.

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