Einzelnen Beitrag anzeigen

chkdsk
(Gast)

n/a Beiträge
 
#2

Re: andere exe-datei in programm einbinden als resource

  Alt 8. Jan 2005, 23:59
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;
  Mit Zitat antworten Zitat