Hallo Delphigemeinde,
Habe folgendes Problem, auf das ich beim Suchen im Internet keine passende Lösung gefunden habe, weil es scheinbar recht unüblich oder eventuell un möglich ist
.
Mein Vorhaben grundsätzlich:
Ich habe eine Formularanwendung und einen Service geschrieben. Beide laufen wie erwünscht.
Da kam mir der Gedanke, dass ich nicht 2 Executables haben möchte sondern nur EINE.
Nun musste ich mir einen Weg überlegen, wie ich es schaffe, dass immer der richtige "Programmteil" gestartet wird.
Meine Lösung: Das Programm erzeugt, wenn es als Service gestartet wird ein
Mutex.
Dieses
Mutex frage ich immer beim Start des Programms ab und starte, wenn das
Mutex bereits existiert, den "Formularteil", andernfalls den "Serviceteil".
Ich gehe davon aus dass der Service IMMER vor dem Programm installiert/gestartet wird! (sonst klappts ja nicht)
Zum Problem:
Der Service wird erfolgreich installiert über "dasprogramm.exe -install", aber er kann nicht gestartet werden.
Fehlermeldung:
"Der Dienst ServiceXYZ kann nicht auf "Lokaler Computer" gestartet werden.
Fehler 1053: Der Dienst antwortete nicht rechtzeitig auf die Start- oder Steuerungsanforderung"
Meine Frage:
Was muss ich ändern damit das klappt, wie es soll? Wie gesagt ... in getrennten EXE-Dateien laufen die 2 Programme, was bedeutet, dass in den anderen units KEINE FEHLER sein können!!!
Vielen Dank im Vorraus!
c20c
Jetzt die paar Codeschnippsel: (vereinfacht, da ansonsten alles viel zu unübersichtlich wird)
dasprogramm.dpr
Delphi-Quellcode:
uses
Windows,
SysUtils,
m_service in 'm_service.pas',
m_application in 'm_application.pas'
c_program in 'c_program.pas',
c_network in 'c_network.pas',
u_methods in 'u_methods.pas',
...
{$R *.res}
const
INVALID_HANDLE=0;
begin
if CreateMutex(nil, false, 'ServiceXYZMutex') = INVALID_HANDLE
then startas_client
else startas_service;
end.
m_application.pas (startas_client)
Delphi-Quellcode:
unit m_application;
interface
procedure startas_client;
implementation
uses
Windows, SysUtils, Forms,
//NEEDED FOR CLIENT
c_program, f_main, f_lock, f_1ststart, f_overlay,
f_settings, f_password, c_watcher, m_objects,
const
INVALID_HANDLE=0;
procedure startas_client;
begin
Application.Initialize;
Application.MainFormOnTaskbar := False;
Application.Title := '
TimeControl 6.003';
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TOverlayForm, OverlayForm);
...
Application.Run;
end;
end.
m_service.pas (startas_service)
Delphi-Quellcode:
unit m_service;
interface
procedure startas_service;
implementation
uses SvcMgr, f_service;
procedure startas_service;
begin
if not Application.DelayInitialize
or Application.Installing
then
Application.Initialize;
Application.CreateForm(TTimeControl6Service, TimeControl6Service);
Application.Run;
end;
end.