Einzelnen Beitrag anzeigen

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