Einzelnen Beitrag anzeigen

c20c

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

Alles in einem: Service und Formularanwendung

  Alt 22. Jul 2010, 19:13
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.
Kermit the Frog
NEIN .... 22 durch 11 ist NICHT 1

Geändert von c20c (22. Jul 2010 um 19:15 Uhr) Grund: fehler entdeckt passiert, wenn man viel rausschneiden muss -.-
  Mit Zitat antworten Zitat