Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Sich selbst neu starten? (https://www.delphipraxis.net/67701-sich-selbst-neu-starten.html)

paritycheck 27. Jul 2006 11:07

Re: Sich selbst neu starten?
 
Hab es nicht weiter getestet aber vielleicht funktioniert folgendes:

Delphi-Quellcode:
program Project1;

uses
  Forms,
  Windows, Sysutils, Messages,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var hMutex: Cardinal;
    aHWND: THandle;

begin
  hMutex:= CreateMutex(nil, True, PChar(ExtractFilename(ParamStr(0))));
  if GetLastError() = ERROR_ALREADY_EXISTS then begin
     aHWND:= FindWindow(nil, PChar('Form1'));
     if ParamStr(1) = '-r' then begin //vielleicht doch erst überprüfen ob das Programm neu getartet werden darf.
                                      //könnte sonst unerwünschte Nebenwirkungen geben....
        if aHWND <> 0 then begin
           SendMessage(aHWND, WM_CLOSE, 0, 0);
           Sleep(1000);
        end;
     end else begin
        MessageBox(0, PChar('Programm läuft bereits.'), PChar(ExtractFilename(ParamStr(0))), mb_OK);
        Halt;
     end;  
  end;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  if hMutex <> 0 then begin
     ReleaseMutex(hMutex);
     CloseHandle(hMutex);
  end;
end.
Dann einfach via CreateProcess oder auch ShellExecute das Programm neu starten.

MuTzE 24. Sep 2006 23:23

Re: Sich selbst neu starten?
 
Eine weitere Möglichkeit wäre diese:

Delphi-Quellcode:
procedure RestartApplication;

 function GetTmpDir: String;
 var
  PC: PChar;
 begin
  PC := StrAlloc(MAX_PATH + 1);
  GetTempPath(MAX_PATH, PC);
  Result := String(PC);
  StrDispose(PC);
 end;

 function GetTmpFileName(Ext: String): String;
 var
  PC: PChar;
 begin
  PC := StrAlloc(MAX_PATH + 1);
  GetTempFileName(PChar(GetTmpDir), 'uis', 0, PC);
  Result := string(PC);
  Result := ChangeFileExt(Result, Ext);
  StrDispose(PC);
 end;

var
 BatchFile: TStringList;
 BatchName: String;
begin
 batchname := GetTmpFileName('.bat');
 FileSetAttr(ParamStr(0), 0);
 BatchFile := TStringList.Create;
 with BatchFile do
  begin
   try
    Add(':Label1');
    Add(Copy(ParamStr(0), 0, 2));
    Add('cd ' + Copy(ExtractFilePath(ParamStr(0)), 4, Length(ExtractFilePath(ParamStr(0))) -1));
    Add('start ' + ExtractFileName(ParamStr(0)));
    Add('del ' + BatchName);
    SaveToFile(BatchName);
    ChDir(GetTmpDir);
    WinExec(PChar(BatchName), SW_HIDE);
   finally
    BatchFile.Free;
   end;
   Halt;
  end;
 Application.Terminate;
end;

Mackhack 25. Sep 2006 00:15

Re: Sich selbst neu starten?
 
Wie marabu schon andeutete mit dem Link, n Mutex und Ruhe ist im Laden :mrgreen:

Pichel 29. Jul 2010 15:03

AW: Re: Sich selbst neu starten?
 
Zitat:

Zitat von MuTzE (Beitrag 529145)
Eine weitere Möglichkeit wäre diese:

Mittlerweile meldet unter anderem Antivir sobald dieser Code verwendet wird einen "TR/Dldr.Delphi.Gen" Virus und man kann ihn nicht mehr wirklich verwenden.

franktron 29. Jul 2010 15:14

AW: Re: Sich selbst neu starten?
 
Zitat:

Zitat von Pichel (Beitrag 1038394)
Zitat:

Zitat von MuTzE (Beitrag 529145)
Eine weitere Möglichkeit wäre diese:

Mittlerweile meldet unter anderem Antivir sobald dieser Code verwendet wird einen "TR/Dldr.Delphi.Gen" Virus und man kann ihn nicht mehr wirklich verwenden.


Das ist nicht der Code sonder ein Virus den es in Delphi gibt such mal hier im Forum das steht das.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:12 Uhr.
Seite 3 von 3     123   

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