Einzelnen Beitrag anzeigen

moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#34

Re: Henne Ei Problem - eigene EXE löschen

  Alt 4. Jun 2009, 08:27
Moin !

So hier mal die Lösung in komplett...
Ich nutze die DSiWin32 und habe Teile aus dem Orginalcode 0xF30FC7 ersetzt.
-> http://17slon.com/gp/gp/dsiwin32.htm

An dieser Stelle nochmal herzlichen Dank an 0xF30FC7 und hoika für die entsprechenden Infos.

Evtl. wäre das ja was für die Codelib?


Delphi-Quellcode:
program DeleteMe;

{$APPTYPE CONSOLE} 

uses
  SysUtils,
  windows,
  DSiWin32 in '..\DSiWin32.pas';

function GetShortFilename(Filename: string) : string;
var
  ShortFilename : array[0..MAX_PATH] of char ;
begin
  if GetShortPathName(PChar(Filename), @ShortFilename, MAX_PATH) > 0
    then Result := ShortFilename
    else Result := Filename;
end;

function DeleteFileOnReboot(Filename : string) : boolean;
begin
  if DSiIsWinNT then
    Result := MoveFileEx(PChar(ParamStr(0)), nil, MOVEFILE_DELAY_UNTIL_REBOOT)
    {
    FIXME:
    Prinzipiell können mehrere NUL Werte existieren. WritePrivateProfileString würde dann den jeweils ersten immer wieder überschreiben.
    Entsprechend wäre der 100% saubere Weg einen eigenen kleinen Parser für die wininit.ini zu bauen, der die rename Section sucht
    und die eigenen Einträge hinten dran hängt.
    }
 
  else
    Result := WritePrivateProfileString('rename', 'nul', PChar(GetShortFilename(Filename)), PChar(DSiGetWindowsFolder + '\wininit.ini'));
end;

procedure ExecuteFile(Filename, Parameters : string);
var
  StartupInformation : TStartupInfo;
  ProcessInformation : TProcessInformation;
begin
  writeln('Temporaere Datei erstellt: ', Filename);
  FillChar(StartupInformation, SizeOf(TStartupInfo), 0);
  FillChar(ProcessInformation, SizeOf(TProcessInformation), 0);
  StartupInformation.cb := SizeOf(TStartupInfo);

  CreateProcess(nil, PChar('"' + Filename + '" ' + Parameters), nil, nil, false,
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInformation,
    ProcessInformation);
end;

procedure CreateAndRunCopyOfMyself();
var
  RandomFilename : string;
begin
  RandomFileName := DSiGetTempFileName('LV_', DSiGetTempPath);
  WriteLn('RandomFileName : ' + RandomFileName);
  if RandomFilename <> '
    then
      if CopyFile(PChar(ParamStr(0)), PChar(RandomFilename), false)
        then ExecuteFile(RandomFilename, '"' + ParamStr(0) + '"')
        else DeleteFile(PChar(RandomFilename));
end;

procedure DeleteMyOldSelfAndMe();
begin
  if FileExists(ParamStr(1))
    then
      repeat
        Sleep(1000);
        writeln('Versuche alte Datei zu entfernen ...');
        WriteLn(ParamStr(1));
      until DeleteFile(PChar(ParamStr(1)));
  WriteLn('lösche ... ' + ExtractFilePath(ParamStr(1)));
  DSiRemoveFolder(ExtractFilePath(ParamStr(1)));
  if DeleteFileOnReboot(ParamStr(0))
    then writeln('Alte Datei entfernt und mich selbst fuer Entfernung bei Reboot eingetragen.')
    else writeln('Alte Datei entfernt, aber ich selbst bin noch da: ', ParamStr(0));
end;

begin
  WriteLn('Starte ...');
  WriteLn(ParamStr(0)); WriteLn(ParamStr(1));
  if LowerCase(ExtractFileExt(ParamStr(0))) = '.tmpthen begin
    WriteLn('-> Temp Version gestartet');
    SetCurrentDirectory(PChar(DSiGetTempPath));
    DeleteMyOldSelfAndMe();
  end else begin
    WriteLn('-> Orginal Version gestartet');
    CreateAndRunCopyOfMyself;
  end;

  Writeln('Enter um die Anwendung zu beenden');
  Readln;
end.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat