AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OneInstance.pas

Ein Thema von hanspeter · begonnen am 8. Mär 2010 · letzter Beitrag vom 1. Mai 2010
Antwort Antwort
hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#1

OneInstance.pas

  Alt 8. Mär 2010, 07:03
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#2

Re: OneInstance.pas

  Alt 8. Mär 2010, 08:00
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
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.
Angehängte Dateien
Dateityp: zip oneinstance_104.zip (3,7 KB, 80x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#3

Re: OneInstance.pas

  Alt 8. Mär 2010, 09:08
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
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#4

Re: OneInstance.pas

  Alt 8. Mär 2010, 10:27
Danke himi, den Beitrag in der CL aktualisiere ich schonmal. Bevor ichs in 2 Wochen vergesse.

Diesen Thread hier lasse ich noch offen, falls ich irgendwas übersehen haben sollte und sich hier eventuell noch ein Fehler versteckt hat.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#5

Re: OneInstance.pas

  Alt 30. Apr 2010, 23:44
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;
  Mit Zitat antworten Zitat
Benutzerbild von Der.Kaktus
Der.Kaktus

Registriert seit: 22. Jan 2008
Ort: Erfurt
958 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: OneInstance.pas

  Alt 1. Mai 2010, 05:04
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..
Gruss Kaki

Repeat Until true=false;
  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 22:40 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