Autor Beitrag
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: So 28.01.07 11:37 
Hallo,
Ich hab mit CreateMutex verhindert, dass mein Prog doppelt gestartet wird, und es funktioniert auch super. Der aufruf sieht bei mir so aus, hab ich irgendwo übernommen:
ausblenden Delphi-Quelltext
1:
hm := CreateMutex(nil, TRUE, 'Anwendung gestartet');					


Meine Frage ist jetzt, was die Parameter bedeuten, weil mir auch msdn leider nicht weiterhilft.
Am wenigsten verstehe ich den letzten Parameter, warum kann ich da irgend einen Schmarrn reinschreiben und es funktioniert trotzdem?
wdbee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: So 28.01.07 13:15 
Also wenn ich in meinem Delphi (D5) in der Hilfe zum Windows SDK nach CreateMutex schaue, finde ich die komplette Beschreibung!

Der erste Parameter ist der "pointer to security attributes", der zweite "flag for initial ownership" und der dritte "pointer to mutex-object name". Warum wunderst du dich eigentlich, dass du deinem Objekt einen beliebigen Namen geben kannst? Solage du in deinem Programm immer der gleichen Namen verwendest, klappt das. Erzeugst du eine andere Version mit einem anderen Namen, geht es schief.
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: So 28.01.07 13:36 
user profile iconwdbee hat folgendes geschrieben:
Also wenn ich in meinem Delphi (D5) in der Hilfe zum Windows SDK nach CreateMutex schaue, finde ich die komplette Beschreibung!

Das ist mir vorhin dann auch aufgefallen, ich hab in der Delphi-Hilfe nach CreateMutex gesucht und nix gefunden, aber mit F1 gehts.

user profile iconwdbee hat folgendes geschrieben:
Der erste Parameter ist der "pointer to security attributes",

den versteh ich leider nicht, aber ich setz ihn einfach auf nil

user profile iconwdbee hat folgendes geschrieben:
der zweite "flag for initial ownership"

den setz ich auf True

user profile iconwdbee hat folgendes geschrieben:
und der dritte "pointer to mutex-object name". Warum wunderst du dich eigentlich, dass du deinem Objekt einen beliebigen Namen geben kannst? Solage du in deinem Programm immer der gleichen Namen verwendest, klappt das. Erzeugst du eine andere Version mit einem anderen Namen, geht es schief.

ok, ich dachte dieser Parameter hätte direkt etwas mit meiner Exe zu tun.

Ich gebe ja die Mutex schon am Anfang des Programms wieder frei. Und wenn dann die neue Instanz die Mutex erstellt, dann ist sie doch schon wieder freigegeben -> es dürfte also kein GetLastError auftreten?
wdbee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: So 28.01.07 13:43 
Die Security Attributes benötigst du nur, wenn du Programme unter verschiedenen Logins damit synchronisieren willst. Dann muss das Betriebssystem wissen, ob der andere Prozess auf dein Objekt zugreifen darf.

Der Name ist nicht der Name deiner EXE sondern des Mutex!

Außerdem darfst du den Mutex nicht freigeben, solange du den Doppelstart verhindern willst. Dann kommt der Fehler und daran erkennst du doch, dass das Programm schon läuft!!! Wenn kein Fehler kommt, wird das Programm ja gestartet.
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: So 28.01.07 14:10 
user profile iconwdbee hat folgendes geschrieben:
Außerdem darfst du den Mutex nicht freigeben, solange du den Doppelstart verhindern willst. Dann kommt der Fehler und daran erkennst du doch, dass das Programm schon läuft!!! Wenn kein Fehler kommt, wird das Programm ja gestartet.

ja, ich glaub jetzt versteh ich das Prinzip endlich!
Aber seltsam, bei mir hats eben funktioniert, obwohl ich das MutexObjekt freigegeben hab, bevor das Programm beendet wurde:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var hm: Integer;
begin  
  hm := CreateMutex(nil, TRUE, 'AOTSetterMutex');
  if GetLastError = ERROR_ALREADY_EXISTS then begin
    //ShowMessage('Läuft schon');
    Application.Terminate;
  end;
  ReleaseMutex(hm);
  Application.Initialize;
  Application.CreateForm(TAOTF, AOTF);
  Application.Run;
end.


Wie gesagt: Hat eben trotzdem funktioniert... :?:


Zuletzt bearbeitet von Jakob Schöttl am Di 20.02.07 13:24, insgesamt 1-mal bearbeitet
wdbee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: So 28.01.07 14:18 
Wenn du ein Programm entwickelst und testest, dabei aber mal das Mutex nicht freigibst, dann existiert es evt. noch, was dann dazu führt, dass du denkst, es geht. Nach einem neuen Systemstart sollte es aber nicht mehr gehen.
Jakob Schöttl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: So 28.01.07 14:25 
ok, danke dann sieht mein Quellcode jetzt also so aus, und testen muss ich ihn hald nochmal sicherheitshalber:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var hm: Integer;
begin  
  hm := CreateMutex(nil, TRUE, 'AOTSetterMutex');
  if GetLastError = ERROR_ALREADY_EXISTS then begin
    //ShowMessage('Läuft schon');
    Application.Terminate;
  end;
  
  Application.Initialize;
  Application.CreateForm(TAOTF, AOTF);
  Application.Run;

  ReleaseMutex(hm);
end.