Re: Henne Ei Problem - eigene EXE löschen
Moin !
Zitat:
Ok so geht es nun. Werde nun mal auf verschiedenen Systemen testen. |
Re: Henne Ei Problem - eigene EXE löschen
Hallo,
ich will einen Keks ;) Du kannst ja zum Schluss die fertige Lösung posten. Heiko |
Re: Henne Ei Problem - eigene EXE löschen
Moin !
Ja das kann ich gerne machen. Will aber erst noch ein bisserl Testen. |
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 09:24 Uhr. |
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