Einzelnen Beitrag anzeigen

Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#3

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

  Alt 26. Feb 2009, 20:37
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;
Thomas
  Mit Zitat antworten Zitat