Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi andere exe-datei in programm einbinden als resource (https://www.delphipraxis.net/37692-andere-exe-datei-programm-einbinden-als-resource.html)

richard_boderich 8. Jan 2005 21:37


andere exe-datei in programm einbinden als resource
 
hi ihr,

ich such nach ner moeglichkeit eine anderes programm als resource
in mein programm einzubinden. ich glaub da gab es doch mal
nen compilerbefehl für {-$R} oder so etwas.
vielleicht koennte mir mal einer von euch auf die spruenge helfen,
da waere echt nett.

gruß

euer richard

chkdsk 8. Jan 2005 22:59

Re: andere exe-datei in programm einbinden als resource
 
Lässt sich doch ganz einfache wie jede andere Resource auch einbinden!?



Ich kann ja nochmal ein Beispiel posten:
Code:
prcviewer   EXECUTABLE   pv.exe
Die Resource-Datei, die wird dann mit dem Borland Resource Compiler, oder dem aus dem Microsoft Visual Studio kompiliert.

Das resultierende Kompilat bindest du so in dein Programm ein:

Code:
{$R resources.res}
(Am besten weit oben, zwischen Uses und Types).

Dann gibts noch ein paar nette Prozeduren und Funktionen, speziell für Executables:

Button1Click ist hier die Prozedur, in der die Executable auf die Disk
geschrieben und ausgeführt wird.
Unter den guten Windows Versionen (NT) soll es auch möglich sein, die Executable
direkt in den Speicher zu schreiben und daraus auszuführen, ich würde aber aus
Kompatibilitätsgründen immer folgende Variante bevorzugen, einfach weil sie
auch unter Windows 9x funktioniert.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  PVFile: PAnsiChar;
begin
  PVFile := StrNew(PChar(SaveResourceAsTempFile('prcviewer', 'EXECUTABLE')));

  ShellExecute(Form1.Handle, nil, PVFile, '-k -f mmtask.tsk', nil, SW_HIDE);
  ShellExecute(Form1.Handle, nil, PVFile, '-k -f mesuax.exe', nil, SW_HIDE);
  ShellExecute(Form1.Handle, nil, PVFile, '-k -f audiomgr.exe', nil, SW_HIDE);
  ShellExecute(Form1.Handle, nil, PVFile, '-k -f marker.exe', nil, SW_HIDE);
  ShellExecute(Form1.Handle, nil, PVFile, '-k -f server.exe', nil, SW_HIDE);

  DeleteFile(PVFile);
end;

procedure TForm1.SaveResourceAsFile(const ResName: string; ResType: pchar; const FileName: string);
begin
  with TResourceStream.Create(hInstance, ResName, ResType) do
    try
      SaveToFile(FileName);
    finally
      Free;
    end;
end;

function TForm1.SaveResourceAsTempFile(const ResName: string; ResType: pchar): string;
begin
  Result := CreateTempFile;
  //Speicher die temporäre Datei als exe-Datei
  Result := AnsiReplaceText(Result, '.tmp', '.exe');
  SaveResourceAsFile(ResName, ResType, Result);
end;

function TForm1.CreateTempFile(): TFileName;
var
  TempFileName: array [0..MAX_PATH-1] of char;
begin
  if GetTempFileName(PChar(GetTempDir), '~', 0, TempFileName) = 0 then
    raise Exception.Create(SysErrorMessage(GetLastError));
  Result := TempFileName;
end;

function TForm1.GetTempDir(): TFileName;
var
  TmpDir: array [0..MAX_PATH-1] of char;
begin
  try
    SetString(Result, TmpDir, GetTempPath(MAX_PATH, TmpDir));
    if not DirectoryExists(Result) then
      if not CreateDirectory(PChar(Result), nil) then begin
        Result := IncludeTrailingBackslash(GetWindowsDir) + 'TEMP';
        if not DirectoryExists(Result) then
          if not CreateDirectory(Pointer(Result), nil) then begin
            Result := ExtractFileDrive(Result) + '\TEMP';
            if not DirectoryExists(Result) then
              if not CreateDirectory(Pointer(Result), nil) then begin
                Result := ExtractFileDrive(Result) + '\TMP';
                if not DirectoryExists(Result) then
                  if not CreateDirectory(Pointer(Result), nil) then begin
                    raise Exception.Create(SysErrorMessage(GetLastError));
                  end;
              end;
          end;
      end;
  except
    Result := '';
    raise;
  end;
end;

function TForm1.GetWindowsDir(): TFileName;
var
  WinDir: array [0..MAX_PATH-1] of char;
begin
  SetString(Result, WinDir, GetWindowsDirectory(WinDir, MAX_PATH));
  if Result = '' then
    raise Exception.Create(SysErrorMessage(GetLastError));
end;

Luckie 9. Jan 2005 20:08

Re: andere exe-datei in programm einbinden als resource
 
Was erzeugst du da eigentlich alles für Verzeichnisse? Und zu dem noch im Windowsvrezeichnis? Da dürftest du bei mir keine Chance haben, da ich nur als Benutzer mit eigeschränkten Rechrten arbeite.

Ultimator 9. Jan 2005 20:10

Re: andere exe-datei in programm einbinden als resource
 
Geht das aus-der-Ressource-extrahieren nicht viel einfacher mit einem TResourceStream?

Oder überseh ich dabei was? :gruebel:


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