Registriert seit: 31. Jul 2004
1.110 Beiträge
Delphi 2010 Professional
|
Re: Henne Ei Problem - eigene EXE löschen
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))) = '.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.
Dominik Schmidt Greetz Dominik
I love Delphi 2007/2010
|
|
Zitat
|