Discussion:
Programm nur einmal starten
(zu alt für eine Antwort)
Michael Gorischek
2004-01-27 12:30:55 UTC
Permalink
Hi,

damit mein Programm nur einmal (gleichzeitig) laufen kann hab ich mir
folgenden Code (von einem Bildschirmschoner) hineinkopiert:

procedure PreventToRunTwice;
var otherHnd : HWND;
begin
otherHnd:=FindWindow('TApplication','XYZ');

if otherHnd<>0 then begin
SetForegroundWindow(otherHnd);
halt;
end;
end;

XYZ steht für mein Programm. Allerdings findet die Routine immer ein
Programm und bricht dann sofort ab. Warum?

Aufgerufen wird die procedure gleich am Anfang bevor noch irgendetwas
initialisiert wird.

Danke im Voraus!

lg Michi
Simon Falk
2004-01-27 12:39:55 UTC
Permalink
Moin,

suche mal bei Google Groups nach "delphi mutex run once". Da lässt
sich einiges finden.

bye bye
Simon
Michael Landenberger
2004-01-27 12:41:13 UTC
Permalink
Post by Michael Gorischek
damit mein Programm nur einmal (gleichzeitig) laufen kann hab
ich mir folgenden Code (von einem Bildschirmschoner)
procedure PreventToRunTwice;
var otherHnd : HWND;
begin
otherHnd:=FindWindow('TApplication','XYZ');
if otherHnd<>0 then begin
SetForegroundWindow(otherHnd);
halt;
end;
end;
XYZ steht für mein Programm. Allerdings findet die Routine
immer ein Programm und bricht dann sofort ab. Warum?
Hallo,

das Programm findet vermutlich sich selbst. Die Routine muss,
wenn sie denn überhaupt funktionieren soll, aufgerufen werden,
bevor das Hauptfenster der Anwendung erstellt wurde. Das aber
scheint bei dir nicht der Fall zu sein, so dass die Routine
das zum Zeitpunkt des Aufrufs bereits existente Hauptfenster
der eigenen Instanz für das einer fremden Instanz hält.

Gruß

Michael
Michael Gorischek
2004-01-27 14:25:04 UTC
Permalink
Hi,
Post by Michael Landenberger
das Programm findet vermutlich sich selbst. Die Routine muss,
wenn sie denn überhaupt funktionieren soll, aufgerufen werden,
bevor das Hauptfenster der Anwendung erstellt wurde. Das aber
scheint bei dir nicht der Fall zu sein, so dass die Routine
das zum Zeitpunkt des Aufrufs bereits existente Hauptfenster
der eigenen Instanz für das einer fremden Instanz hält.
Die procedure wird an folgender Stelle aufgerufen:

begin
PreventToRunTwice;
Application.Initialize;
Application.Title := 'XYZ';
SplashScreen:=TSplashScreen.Create(Application);
SplashScreen.Show;
SplashScreen.Update;
Application.CreateForm(TMainform, Mainform);
Application.CreateForm(TSplashScreen, SplashScreen);
SplashScreen.Free;
Application.Run;
end.

Noch früher gehts ja nicht, oder?

lg Michi
Nico Mertens
2004-01-27 12:46:25 UTC
Permalink
Post by Michael Gorischek
procedure PreventToRunTwice;
var otherHnd : HWND;
begin
otherHnd:=FindWindow('TApplication','XYZ');
if otherHnd<>0 then begin
SetForegroundWindow(otherHnd);
halt;
end;
end;
XYZ steht für mein Programm. Allerdings findet die Routine immer ein
Programm und bricht dann sofort ab. Warum?
Aufgerufen wird die procedure gleich am Anfang bevor noch irgendetwas
initialisiert wird.
das müsste dir weiterhelfen.
http://www.swissdelphicenter.ch/de/showcode.php?id=42

mfg
Marian Aldenhoevel
2004-01-27 14:32:04 UTC
Permalink
Hi,
Post by Michael Gorischek
otherHnd:=FindWindow('TApplication','XYZ');
XYZ steht für mein Programm. Allerdings findet die Routine immer ein
Programm und bricht dann sofort ab. Warum?
Weil es entweder sich selbst findet - falls Du den Versuch zu spät, nach
der Erzeugung des Hauptformulars unternimmst. Oder weil es das Fenster
findet, daß Du in Deiner IDE offen hast.

Verwende einen Mutex.

Ciao, MM
--
Rosenhain 23, 53123 Bonn - Fon +49 228 6203366, Fax +49 228 624031
www.marian-aldenhoevel.de
"Time is natures way to make sure everything does not happen at once"
Michael Gorischek
2004-01-27 14:26:11 UTC
Permalink
Hi,
Post by Marian Aldenhoevel
Weil es entweder sich selbst findet - falls Du den Versuch zu spät, nach
der Erzeugung des Hauptformulars unternimmst. Oder weil es das Fenster
findet, daß Du in Deiner IDE offen hast.
Die IDE ist zu.
Die procedure wird an folgender Stelle aufgerufen:

begin
PreventToRunTwice;
Application.Initialize;
Application.Title := 'XYZ';
SplashScreen:=TSplashScreen.Create(Application);
SplashScreen.Show;
SplashScreen.Update;
Application.CreateForm(TMainform, Mainform);
Application.CreateForm(TSplashScreen, SplashScreen);
SplashScreen.Free;
Application.Run;
end.

Noch früher gehts ja nicht, oder?
Post by Marian Aldenhoevel
Verwende einen Mutex.
Das werde ich mir mal anschauen.

lg Michi
Andreas Kardin
2004-01-27 18:01:27 UTC
Permalink
Post by Michael Gorischek
Noch früher gehts ja nicht, oder?
Naja, jetzt muss ich mich als derjenige, der das verbochen hat, halt auch
mal melden :)

Starte doch mal WinSight (ich nehm mal an, dass der bei jeder Delphi-
Edition dabei ist) und schau, ob da schon ein Fenster mit dem
entsprechenden Namen existiert und wenn ja, welchem Prozess es gehört.
Post by Michael Gorischek
Post by Marian Aldenhoevel
Verwende einen Mutex.
Das ist eine absolut gute Idee und besser geeignet, da Du dort einen
möglichst exotischen, eindeutigen Namen für den Mutex wählen kannst.

Bei Screensavern, die sich Mühe geben, sich zu verstecken (d.h. nicht in
der Taskleiste sichtbar sind), kann man als Applikationstitel auch einen
ausgefallen Namen nehmen, da der ja nirgends gesehen wird.

Ich werd die Routine bei Gelegenheit im Tutorial auch durch eine Mutex-
Variante ersetzen.

Grüsse
--
Andreas Kardin - Software Developer - E-Mail : ***@mephzara.com
- Main Web Site : www.mephzara.com
- Particle Systems Screen Saver : www.mephzara.com/particle-systems/
- XDreamity : www.xdreamity.de
Andreas Kardin
2004-01-27 18:35:35 UTC
Permalink
Marian Aldenhoevel wrote :

[...]
Oder weil es das Fenster findet, daß Du in Deiner IDE offen hast.
Gibt es einen Fall, wo ein Fenster mit der Fensterklasse TApplication schon
während der Design-Zeit geöffnet ist?

Grüsse
--
Andreas Kardin - Software Developer - E-Mail : ***@mephzara.com
- Main Web Site : www.mephzara.com
- Particle Systems Screen Saver : www.mephzara.com/particle-systems/
- XDreamity : www.xdreamity.de
Marian Aldenhoevel
2004-01-27 19:28:10 UTC
Permalink
Hallo,
Post by Andreas Kardin
Gibt es einen Fall, wo ein Fenster mit der Fensterklasse TApplication schon
während der Design-Zeit geöffnet ist?
Wohl nicht, das habe ich nicht genau genug gelesen.

Ciao, MM
--
Rosenhain 23, 53123 Bonn - Fon +49 228 6203366, Fax +49 228 624031
www.marian-aldenhoevel.de
"Time is natures way to make sure everything does not happen at once"
Marian Aldenhoevel
2004-01-27 19:29:07 UTC
Permalink
Hi,
Post by Andreas Kardin
Gibt es einen Fall, wo ein Fenster mit der Fensterklasse TApplication schon
während der Design-Zeit geöffnet ist?
Korrektur: Klar kann es das geben, man braucht nur ein Fenster seiner
Applikation "Application" genannt zu haben ;-).

Ciao, MM
--
Rosenhain 23, 53123 Bonn - Fon +49 228 6203366, Fax +49 228 624031
www.marian-aldenhoevel.de
"Time is natures way to make sure everything does not happen at once"
Christian NineBerry Schwarz
2004-01-27 19:20:14 UTC
Permalink
Hallo
Post by Marian Aldenhoevel
Post by Andreas Kardin
Gibt es einen Fall, wo ein Fenster mit der Fensterklasse
TApplication schon während der Design-Zeit geöffnet ist?
Korrektur: Klar kann es das geben, man braucht nur ein Fenster
seiner Applikation "Application" genannt zu haben ;-).
Das Haupt-Fenster hinter jeder VCL-Anwendung (dem TApplication.Handle
gehört) hat die Fenster-Klasse "TApplication". Sobald also irgendeine
beliebige VCL-Anwendung (z.B. die Delphi-IDE) läuft, gibt es im System
ein Fenster der Klasse "TApplication".


Traubensaft gibt Traubenkraft

Christian "NineBerry" Schwarz
--
Lebensborn - Built up somewhere in Germany
Lebensborn - Was made for racial policy
Lebensborn - A fateful part in history
Lebensborn - Invigorate democracy!
Marian Aldenhoevel
2004-01-27 20:16:54 UTC
Permalink
Hi,
Post by Christian NineBerry Schwarz
Das Haupt-Fenster hinter jeder VCL-Anwendung (dem TApplication.Handle
gehört) hat die Fenster-Klasse "TApplication".
In diesem Fall muss es ja auch noch die richtige Caption haben. Ein
Hauptfenster mit dieser Caption und der Name-Eigenschaft "Application"
würde auch schon die Bedingung erfüllen? Oder verwendet der
Objektinspektor da irgendeinen Ersatz? Ich habe gerade kein WinSight
zur Hand.

Ciao, MM
--
Rosenhain 23, 53123 Bonn - Fon +49 228 6203366, Fax +49 228 624031
www.marian-aldenhoevel.de
"Time is natures way to make sure everything does not happen at once"
Christian NineBerry Schwarz
2004-01-27 20:25:13 UTC
Permalink
Hallo Marian
Post by Marian Aldenhoevel
In diesem Fall muss es ja auch noch die richtige Caption haben.
Ein Hauptfenster mit dieser Caption und der Name-Eigenschaft
"Application" würde auch schon die Bedingung erfüllen? Oder
verwendet der Objektinspektor da irgendeinen Ersatz? Ich habe
gerade kein WinSight zur Hand.
Ich habe mir gerade mal das OP angeschaut und gesehen, dass da ein
FindWindow mit der Caption (zusätzlich) als Bedingung steht.

Dann triggert da natürlich nicht jede VCL-Anwendung. Ich bin erst
später in den Thread eingestiegen, als nur noch von der Fensterklasse
"TApplication" die Rede war.


Traubensaft gibt Traubenkraft

Christian "NineBerry" Schwarz
--
Lebensborn - Built up somewhere in Germany
Lebensborn - Was made for racial policy
Lebensborn - A fateful part in history
Lebensborn - Invigorate democracy!
Lesen Sie weiter auf narkive:
Loading...