Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi OneInstance.pas (https://www.delphipraxis.net/148777-oneinstance-pas.html)

hanspeter 8. Mär 2010 07:03


OneInstance.pas
 
In der Codelib befindet sich der Beitrag OneInstance.
Leider funktioniert die Componente nicht mehr mit D2010.
(Der Parameter Kommandozeile enthält die ersten paar Zeichen und dann Zeichensalat. - Anpassung Unicode)
Ehe ich mich selber an die Arbeit mache, möchte ich mal ganz vorsichtig anfragen, ob
wer das Problem schon gelöst hat und ich mir die Arbeit ersparen kann?

Gruß
Peter

himitsu 8. Mär 2010 08:00

Re: OneInstance.pas
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ist ja jetzt nix groß Aufwändiges.
- das Problem lag im befüllen und auslesen des TCopyDataStruct
- theoretisch müßte es jetzt unter allen Delphi-Versionen lauffähig sein
- Probleme wird es aber ab Win7 geben, wenn z.B. die laufende Instanz Adminrechte besitzt und die neue Instanz mit geringeren Rechten (einfacher Benutzer) gestartet wurde, dann dann kann aus "Sicherheitsgründen" (laut MS) die Windowsbotschaft nicht verschickt werden, da dieses geblockt wird.

Es wäre auch Besser/Schöner, wenn man bei sowas auch gleich den Link zum Thread mit angibt ... erstpart etwas Arbeit :zwinker:
Weitere Programm-Instanzen verhindern mit Parameterübergabe

Weitere behobene Dinge:

In ExtractParams konnte es zu einem Problem kommen, wenn es keine Parameter gibt.
P1 := Pointer(S); liefert in soeinem Fall einen NIL-Pointer und z.B. while P1^ <> #0 do läuft beim dereferenzieren in eine Exception.

Beim NewInstProc (TNewInstProc) wurde der Parameter ProcessId mit cbData (der Datenlänge des TCopyDataStruct) gefüllt ... hab dort jetzt schnell erstmal wenigstens das Window-Handle eingetragen.

hanspeter 8. Mär 2010 09:08

Re: OneInstance.pas
 
Zitat:

Zitat von himitsu
Ist ja jetzt nix groß Aufwändiges.
- das Problem lag im befüllen und auslesen des TCopyDataStruct

Danke!
Man Du bist gut, ich habe nur kurz probiert und hätte mich dann heute Vormittag dran gemacht.
Für meine Aufgabe haben alle Programme die gleiche Berechtigung.
Ich habe mir ein Plugin-System auf der Basis von Exe-Files gebaut und will die Komponente
hier verwenden.

Gruß
Peter

Mithrandir 8. Mär 2010 10:27

Re: OneInstance.pas
 
Danke himi, den Beitrag in der CL aktualisiere ich schonmal. Bevor ichs in 2 Wochen vergesse. :mrgreen:

Diesen Thread hier lasse ich noch offen, falls ich irgendwas übersehen haben sollte und sich hier eventuell noch ein Fehler versteckt hat. ;)

idefix2 30. Apr 2010 23:44

Re: OneInstance.pas
 
Zum Thema OneInstance:
Ein Hinweis für alle, die nur verhindern wollen, dass eine zweite Instanz eines Programms gestartet wird und das neu gestartete Programm abbrechen wollen, wenn es schon eine solche gibt, ohne dem anderen Programm eine Nachricht zu schicken: Für diese Aufgabe gibt es das wenig bekannte Windows Mutex Objekt, das diese Aufgabe auf einfachste Art erledigt:

Delphi-Quellcode:
procedure AbortIfNotUnique (const Bezeichnung: string);
begin
  createMutex( nil, true, PWideChar(Bezeichnung));
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    MessageDlg('Das Programm '+Bezeichnung+' ist schon in Betrieb'#13#10
                +'Sie können immer nur eine Version des Programmes starten',
                mtError,[mbOk],0);
    halt;
  end;
end;

Der.Kaktus 1. Mai 2010 05:04

Re: OneInstance.pas
 
Zitat:

Zitat von idefix2
Zum Thema OneInstance:
Ein Hinweis für alle, die nur verhindern wollen, dass eine zweite Instanz eines Programms gestartet wird und das neu gestartete Programm abbrechen wollen, wenn es schon eine solche gibt, ohne dem anderen Programm eine Nachricht zu schicken: Für diese Aufgabe gibt es das wenig bekannte Windows Mutex Objekt, das diese Aufgabe auf einfachste Art erledigt:

Delphi-Quellcode:
procedure AbortIfNotUnique (const Bezeichnung: string);
begin
  createMutex( nil, true, PWideChar(Bezeichnung));
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    MessageDlg('Das Programm '+Bezeichnung+' ist schon in Betrieb'#13#10
                +'Sie können immer nur eine Version des Programmes starten',
                mtError,[mbOk],0);
    halt;
  end;
end;

Das sieht richtig uebersichtlich aus.. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:14 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