AGB  ·  Datenschutz  ·  Impressum  







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

Alles in einem: Service und Formularanwendung

Ein Thema von c20c · begonnen am 22. Jul 2010 · letzter Beitrag vom 23. Jul 2010
 
c20c

Registriert seit: 23. Mai 2009
Ort: Liederbach
9 Beiträge
 
Delphi 2009 Architect
 
#10

AW: Alles in einem: Service und Formularanwendung

  Alt 23. Jul 2010, 11:59
Damit das hier kein Sinnlos-Thread ist, teile ich meine Erkenntnisse mit der DP-Community.

Also alles klappt nun, nach folgenden Änderungen:

1. Ein normaler Named Mutex ist auf Sessions begrenzt, dh., dass man einen Globalen Mutex setzen muss, wenn der Dienst den Mutex von einer "normalen" Anwendung sehen soll und umgekehrt. Das funktioniert mit der Namensprefix "Global\".
Delphi-Quellcode:
CreateMutex(nil,false,'Global\Beispielmutex');
;
2. Wenn man einen Globalen Mutex "abfragen" möchte und er breits existiert, bekommt man NICHT über GetLastError den Fehler ERROR_ALREADY_EXISTS, aber das zurückgegebene Mutexhandle ist = 0(invalid).
Dh. dass man sollte immer beides abfragen.
Delphi-Quellcode:
hMutex:=CreateMutex(nil, false, 'Global\Beispielmutex');
if (hMutex = INVALID_HANDLE) or(GetLastError = ERROR_ALREADY_EXISTS) then ...
Wichtig ist auch, Mutex wieder Freigeben über:
Delphi-Quellcode:
ReleaseMutex(hMutex);
CloseHandle(hMutex);

Wenn man statt ein Mutex lieber Startparameter verwendende möchte (wie himitsu vorgeschlagen hat), kann man diese bei folgender Funktion angeben.
Delphi-Quellcode:
CreateService( SCM,
               PWideChar('TCTRL6S01'),
               PWideChar('TCTRL6Service'),
               SERVICE_ALL_ACCESS,
               SERVICE_WIN32_OWN_PROCESS,
               SERVICE_AUTO_START,
               SERVICE_ERROR_NORMAL,
               'C:\BeispielService.exe Parameter1 Parameter2', //usw
               nil,
               nil,
               nil,
               nil,
               nil);
Nachteil: Durch die Eigenwahl des Anzeigenamens, bzw des Servicenamens ist eine Deinstallation über "C:\BeispielService.exe -uninstall" nicht mehr möglich. (logischerweise)
Abhilfe siehe:
Delphi-Quellcode:
OpenService();
DeleteService();

Ein Per-Hand-Installieren wird aber dem entsprechend schwierig, weil der von Delphi "vorkonstuierte" tService beim Installieren keine Parameter einfügt. Folglich hat man 2 Möglichkeiten: Entweder eine eigene Klasse von tService ableiten und die Installationsroutine anpassen, oder in der Registry bestimmte Einträge abändern.


Zum Abschluss noch ein Kommentar:
DP ist genial. Ich profitiere immer wieder von den Threads.
Es wäre aber genial, wenn der letzte Post die wichtigsten für das Thema relevanten Erkenntnisse aufführt.
(so wie dieser )

Ahoi c20c
Kermit the Frog
NEIN .... 22 durch 11 ist NICHT 1

Geändert von c20c (23. Jul 2010 um 12:04 Uhr)
  Mit Zitat antworten Zitat
 


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 17:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz