AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Problem beim Programmneustart mit Instanzkontrolle
Thema durchsuchen
Ansicht
Themen-Optionen

Problem beim Programmneustart mit Instanzkontrolle

Ein Thema von Opa Knack · begonnen am 7. Nov 2013 · letzter Beitrag vom 10. Nov 2013
Antwort Antwort
Opa Knack

Registriert seit: 28. Dez 2004
Ort: Köln
166 Beiträge
 
#1

Problem beim Programmneustart mit Instanzkontrolle

  Alt 7. Nov 2013, 01:01
Delphi-Version: 2006
Hallo,

mit folgender Unit stelle ich sicher, dass mein Programm nur einmal gestartet wird.

Delphi-Quellcode:
unit Startkontrolle;

interface

implementation

uses windows,Dialogs,sysutils;

var mHandle: THandle; // Mutexhandle

Initialization

      mHandle := CreateMutex(nil,True,'zeugnis.exe');

      if GetLastError = ERROR_ALREADY_EXISTS then
      begin
            showMessage('Es läuft bereits eine Instanz des Programms');
            Halt;
      end;

finalization

      if mHandle <> 0 then CloseHandle(mHandle)
end.
Im Programm selbst ergibt sich die Notwendigkeit, das Programm neu starten zu müssen. Hierzu verwende ich

Delphi-Quellcode:
form1.Close;
application.ProcessMessages;
ShellExecute(Application.Handle, 'open', Pchar(ParamStr(0)), nil, nil, sw_SHOWNORMAL);
Das Problem ist nun, dass beides sich nicht wirklich mag. Wenn ich neu starten lasse, läuft ja noch eine Instanz, wodurch die Startkontrolle sich beschwert und den Neustart abbricht.

Hat jemand eine Idee, wie ich das elegant lösen könnte?

Danke vorab
Opa
  Mit Zitat antworten Zitat
musicman56
(Gast)

n/a Beiträge
 
#2

AW: Problem beim Programmneustart mit Instanzkontrolle

  Alt 7. Nov 2013, 01:56
Hallo,

ich hab mir für diesen Zweck einen kleinen Programmstarter geschrieben, der zwei Kommandozeilenparameter auswertet:

1. Das zu startende Programm

2. Die Wartezeit

Das kleine Progrämmchen ist übrigens auch nützlich, wenn man Programme im Windows-Autostart starten möchte, aber sichergehen will/muss, dass alle anderen Programme im Autostart schon vorher gestartet sind, weil z.B. eine Abhängigkeit besteht.

Übrigens...
Delphi-Quellcode:
  ...
  mHandle := CreateMutex(nil,True,ExtractFileName(ParamStr(0)));
  ...
... und die Unit funzt mit jeder Echse
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Problem beim Programmneustart mit Instanzkontrolle

  Alt 7. Nov 2013, 01:59
Ich würde vor dem Aufruf des Programms den Mutex wieder freigeben ...

BTW

Den Code in finalization kannst du dir sparen, denn
Zitat:
Use the CloseHandle function to close the handle. The system closes the handle automatically when the process terminates. The mutex object is destroyed when its last handle has been closed.
schön ist auch
Zitat:
If you are using a named mutex to limit your application to a single instance, a malicious user can create this mutex before you do and prevent your application from starting. To prevent this situation, create a randomly named mutex and store the name so that it can only be obtained by an authorized user. Alternatively, you can use a file for this purpose. To limit your application to one instance per user, create a locked file in the user's profile directory.
Quelle: http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 7. Nov 2013 um 02:08 Uhr)
  Mit Zitat antworten Zitat
musicman56
(Gast)

n/a Beiträge
 
#4

AW: Problem beim Programmneustart mit Instanzkontrolle

  Alt 7. Nov 2013, 02:09
Hi Sir Rufo,

sag mal, wann schläfst du denn?

Klar, die Unit hat noch Verbesserungspotential. Ich gebe den Mutex auch nicht frei. Habe es auch noch nirgendwo gesehen, muss aber nichts bedeuten. Ich dachte immer, bei Programmende wird der Mutex automatisch freigegeben?

Hier mal meine Variante:

Delphi-Quellcode:
unit RuMutex;

interface

uses Windows, SysUtils;

function CreateRubinSoftwareMutex(MutexName: string): boolean;
function CreateApplicationMutex: boolean;

implementation

function StringReplace(Value: string): string;
var
  i: integer;
begin
  Result := Value;
  for i := 1 to Length(Result) do
  if not CharInSet(Result[i],['0'..'9','a'..'z','A'..'Z'])
  then Result[i] := '_';
end;

function CreateRubinSoftwareMutex(MutexName: string): boolean;
var
  LastError : DWord;
  SecurityDesc : TSecurityDescriptor;
  SecurityAttr : TSecurityAttributes;
  aName : string;
  Res : Cardinal;
begin
  Result := false;
  InitializeSecurityDescriptor(@SecurityDesc, SECURITY_DESCRIPTOR_REVISION);
  SetSecurityDescriptorDacl(@SecurityDesc, True, nil, False);
  SecurityAttr.nLength := SizeOf(SecurityAttr);
  SecurityAttr.lpSecurityDescriptor := @SecurityDesc;
  SecurityAttr.bInheritHandle := False;
  aName := 'Global\RUBiN_Software_' + StringReplace(MutexName);
  Res := CreateMutex(@SecurityAttr, True, PChar(aName));
  LastError := GetLastError;
  if (Res = 0) then raise EOSError.Create('Mutex Modul-Name <'
                         + aName+'> konnte nicht erzeugt werden. Fehler-Code:'
                         + IntToStr(LastError))
  else if (LastError <> ERROR_ALREADY_EXISTS) then Result := true;
end;

function CreateApplicationMutex: boolean;
begin
  Result := CreateRubinSoftwareMutex(ParamStr(0));
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Problem beim Programmneustart mit Instanzkontrolle

  Alt 7. Nov 2013, 02:22
Wenn du das in eine Klasse und als Klassenmethoden verpackst wird das schon runder.

Ich kann da mal - nach meinem Schönheitsschlaf - einen Entwurf machen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
musicman56
(Gast)

n/a Beiträge
 
#6

AW: Problem beim Programmneustart mit Instanzkontrolle

  Alt 7. Nov 2013, 02:49
Noch runder als rund....ich bin gespannt
Brauch jetzt auch meinen Schönheitsschlaf.
  Mit Zitat antworten Zitat
Antwort Antwort


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:09 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