Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi [gelöst] Henne Ei Problem - eigene EXE löschen (https://www.delphipraxis.net/134972-%5Bgeloest%5D-henne-ei-problem-eigene-exe-loeschen.html)

moelski 3. Jun 2009 09:31

Re: Henne Ei Problem - eigene EXE löschen
 
Moin !

Zitat:

SetCurrentDirectory
Treffer - versenkt :-D

Ok so geht es nun. Werde nun mal auf verschiedenen Systemen testen.

hoika 3. Jun 2009 10:30

Re: Henne Ei Problem - eigene EXE löschen
 
Hallo,

ich will einen Keks ;)

Du kannst ja zum Schluss die fertige Lösung posten.


Heiko

moelski 3. Jun 2009 10:33

Re: Henne Ei Problem - eigene EXE löschen
 
Moin !

Ja das kann ich gerne machen.
Will aber erst noch ein bisserl Testen.

moelski 4. Jun 2009 07:27

Re: Henne Ei Problem - eigene EXE löschen
 
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. :thumb:

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))) = '.tmp' then 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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:55 Uhr.
Seite 4 von 4   « Erste     234   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz