Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Programm aus Programm starten (aus dem Speicher) (https://www.delphipraxis.net/24958-programm-aus-programm-starten-aus-dem-speicher.html)

alexwilhelm 29. Jun 2004 02:23


Programm aus Programm starten (aus dem Speicher)
 
Hi,

Ich will folgendes machen :

Ich habe in meinem Projekt eine EXE gespeichert (über ein VCL). Nun will ich die EXE in den Speicher laden und ausführen.
Also ohne auf der Festplatte zwischen zu speichern ...
Ich will das machen um die Performance meines Programmes zu erhöhen.

Hat einer eine Idee wie ich das machen kann? Ist es überhaupt sinnvoll?

NicoDE 29. Jun 2004 02:48

Re: Programm aus Programm starten (aus dem Speicher)
 
Zitat:

Zitat von alexwilhelm
Hat einer eine Idee wie ich das machen kann?

Schreib ein Betriebssystem oder alternativ die verschiedenen Loader von Windows nach.
Microsoft Portable Executable and Common Object File Format Specification
Zitat:

Zitat von alexwilhelm
Ist es überhaupt sinnvoll?

Nein.

Delphi-Noobie 29. Jun 2004 16:24

Re: Programm aus Programm starten (aus dem Speicher)
 
Is die exe in einer Res Datei compiliert und dann in die Hauptexe eingebunden? Wenn ja dann könnt ich dir helfen wenn nicht dann nich :). Sry das ich das frag aber ich weis halt nich so was mit vcl gemeint is :(

Ultimator 29. Jun 2004 16:38

Re: Programm aus Programm starten (aus dem Speicher)
 
Kann man eigentlich auch ein Programm in die Ressourcen für dieses aufnehmen, also dass man das Programm "in sich selbst reinkompiliert" ?

Übrigens, Herzlich Willkommen in der DP :party:

Neuni 29. Jun 2004 16:47

Re: Programm aus Programm starten (aus dem Speicher)
 
Erstmal Herzlich Willkommen in der DP :party: `(is doch dein erster beitag, oder??? Warum sagt denn niemand hallo :gruebel: )

Was ist das denn für eine VCL die du benutzt?

Tortus 29. Jun 2004 17:07

Re: Programm aus Programm starten (aus dem Speicher)
 
Zitat:

Zitat von Ultimator
Kann man eigentlich auch ein Programm in die Ressourcen für dieses aufnehmen, also dass man das Programm "in sich selbst reinkompiliert" ?

Halte dies für unmöglich, da ja zum Zeitpunkt des kompilierens noch kompiliert wird,.. also müsste man ja kompilieren, danach mit der kompilierten nochmal kompilieren,.. wobei sihc aber wieder die Exe ändert, und somit das spiel von vorn beginnt,...

Irgendwie erinnert mich das ganze jetzt wieder an dieses Gesetz, das man nichts messen kann, ohne das Ergebnis zu verfälschen,.. hach, wie hie0 das noch,...

Christian Seehase 29. Jun 2004 17:18

Re: Programm aus Programm starten (aus dem Speicher)
 
Moin Tortus,

Zitat:

Zitat von Tortus
,.. hach, wie hie0 das noch,...

Meinst Du die Heisenbergsche Unschärferelation?

@Ultimator:
Grundsätzlich kannst Du in die Resourcen alles mit einkompilieren was Du, nur halt sich selber nicht, wie Tortus ja schon ausgeführt hat.

Delphi-Noobie 29. Jun 2004 17:24

Re: Programm aus Programm starten (aus dem Speicher)
 
warum sollte man das nich können ultimator? einfach die Exe des Progs erstellen und dann nochmal ne exe erstellen und die andere Exe dann intern reincompilieren (also 2 mal das selbe Prog in einem(sinnlos))

Ultimator 29. Jun 2004 17:26

Re: Programm aus Programm starten (aus dem Speicher)
 
OK, danke!

Das mit der Heisenbergschen Unschärferelation ist doch fast das Gleiche wie mit den Wahrsagern.
Die erzählen einem doch auch das, was passiert wäre, wenn man nicht gewusst hätte, dass es passiert.
D.h., man ginge (unwissend) aus dem Haus und würde von einem Ziegelstein erschlagen. Da man aber
weiß, dass man von einem Ziegelstein erschlagen würde, wartet man etwas und geht dann erst. Deshalb
kann man oft sagen, Wahrsager hätten nie Recht :wink:

Luckie 29. Jun 2004 18:38

Re: Programm aus Programm starten (aus dem Speicher)
 
Klar geht das, nur eben nicht so wie du willst. Du kannst eine Exe als Ressource reinpacken, wen ndu sie brauchst entpackst du sie auf die Festplatte und speicherst sie. Warum muss es denn unbedingt aus dem Speicher sein? Wenn das ganze von CD-ROM gestartet wird, dann such dir das temporäre Verzeichnis des Benutzer und entpack sie dahin - und nicht vergessen sie wieder zu löschen.

Btw. hat NicoDE so was shcon mal gemacht, eine anwendung aus dem Speicher starten. Zu finden bei mir hier: http://www.luckie-online.de/Ablage/Exporte/Nico/ -> inmemexe.zip

Delphi-Noobie 29. Jun 2004 19:22

Re: Programm aus Programm starten (aus dem Speicher)
 
Wieso muss man die erst irgendwo speichern @ Luckie? ich compiliere sie auch immer ein und öffne sie ohne zwischen zu speichern. Also 2 Exen in eine.

NicoDE 29. Jun 2004 19:32

Re: Programm aus Programm starten (aus dem Speicher)
 
Zitat:

Zitat von Delphi-Noobie
Wieso muss man die erst irgendwo speichern @ Luckie? ich compiliere sie auch immer ein und öffne sie ohne zwischen zu speichern. Also 2 Exen in eine.

Unter welchen Betriebssystemen funktioniert Deine Methode und wie aufwendig ist die Implementation?

Delphi-Noobie 29. Jun 2004 20:08

Re: Programm aus Programm starten (aus dem Speicher)
 
ups jetzt hab ich auch bemerkt, dass er sie erst speichert aber ich hab das mit dem gleich öffnen nur gedacht weil ich die exe nie gesehen hab, da er sie ja sofort wieder löscht :(. hatte den Code noch gar nicht so richtig studiert, da er ja nich von mir is. Sry :pale:
hier trotzdem nochmal der Code:
Code:
function GetTempDir: string;
var
  Buffer: array[0..MAX_PATH] of Char;
begin
  GetTempPath(SizeOf(Buffer) - 1, Buffer);
  Result := StrPas(Buffer);
end;

function ExtractRes(ResType, ResName, ResNewName: string): Boolean;
var
  Res: TResourceStream;
begin
  Result := False;
  Res := TResourceStream.Create(Hinstance, Resname, PChar(ResType));
  try
    Res.SavetoFile(ResNewName); //<-- nich gesehen hab :(
    Result := True;
  finally
    Res.Free;
  end;
end;

procedure ShellExecute_AndWait(FileName: string);
var
  exInfo: TShellExecuteInfo;

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 not ShellExecuteEx(@exInfo) then
  Exit;
end;

Procedure Exeoeffnen(Resname:string);
var notepad:string;
begin
notepad := GetTempDir + 'Notepad_FROM_RES.EXE';
if ExtractRes('EXEFILE', Resname, notepad) then
    if FileExists(notepad) then
    begin
      ShellExecute_AndWait(notepad);
      DeleteFile(notepad);
    end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Exeoeffnen('der Resname des progs');
end;
:oops:

alexwilhelm 30. Jun 2004 05:31

Re: Programm aus Programm starten (aus dem Speicher)
 
Wow ... Ich wollt zuerst ein paar Tage warten und dann wieder vorbei schauen - aber so viele Anworten an einem Tag.

@Neuni : Ich speicher die EXE mit dem JEDI Komponenten im einem Formular. Dann steht mir die Datei als TStream zu Verfügung.

@Luckie : Danke ich werde mir das mal anschauen.

Danke nochmal. Wenn ich eine gute Lösung finden, dann poste ich den Code.

Alexander Wilhelm.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:16 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