AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi [gelöst] Henne Ei Problem - eigene EXE löschen
Thema durchsuchen
Ansicht
Themen-Optionen

[gelöst] Henne Ei Problem - eigene EXE löschen

Ein Thema von moelski · begonnen am 2. Jun 2009 · letzter Beitrag vom 4. Jun 2009
Antwort Antwort
Seite 4 von 4   « Erste     234   
moelski

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

Re: Henne Ei Problem - eigene EXE löschen

  Alt 3. Jun 2009, 10:31
Moin !

Zitat:
SetCurrentDirectory
Treffer - versenkt

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

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#32

Re: Henne Ei Problem - eigene EXE löschen

  Alt 3. Jun 2009, 11:30
Hallo,

ich will einen Keks

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


Heiko
Heiko
  Mit Zitat antworten Zitat
moelski

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

Re: Henne Ei Problem - eigene EXE löschen

  Alt 3. Jun 2009, 11:33
Moin !

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

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
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
Antwort Antwort
Seite 4 von 4   « Erste     234   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:32 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