Einzelnen Beitrag anzeigen

moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#1

Problem : Dienst unter Windows 2003

  Alt 6. Okt 2009, 10:23
Moin !

Ich habe einen kleinen Dienst geschrieben der eigentlich nix anderes tut als Anwendungen im System Mode nachzustarten. Funzt auf XP ganz gut.

Unter Server 2003 geht das aber nicht. Im eventlog steht folgendes:
Zitat:
Der Dienstprozess konnte keine Verbindung mit dem Dienstcontroller herstellen.
Wenn man den Service erstellen lässt, dann steht da ja auch schon folgendes:
Zitat:
// Für Windows 2003 Server muss StartServiceCtrlDispatcher
// CoRegisterClassObject aufgerufen werden, das von Application.Initialize
// indirekt aufgerufen werden kann. TServiceApplication.DelayInitialize ermöglicht,
// dass Application.Initialize von TService.Main aufgerufen werden kann
// (nachdem StartServiceCtrlDispatcher aufgerufen wurde).
//
// Eine verzögerte Initialisierung des Application-Objekts könnte sich auf
// Ereignisse auswirken, die dann vor der Initialisierung auftreten, wie z.B.
// TService.OnCreate. Dies wird nur empfohlen, wenn ServiceApplication
// ein Klassenobjekt bei OLE registriert und sollte nur in Verbindung mit
// Windows 2003 Server verwendet werden.
Kann mir jemand mal ein Stückchen Code zeigen wo ich nun was zusätzlich aufrufen muss?

Ich habe im Web dazu das gefunden:
Delphi-Quellcode:
function IsRunningInInstallMode : Boolean;

  function FindSwitch(const Switch: string): Boolean;
  begin
    Result := FindCmdLineSwitch(Switch, ['-', '/'], True);
  end;

begin
  Result := FindSwitch('REGSERVER') or FindSwitch('UNREGSERVER') or
            FindSwitch('INSTALL') or FindSwitch('UNINSTALL');
end;

procedure TAISConnectMail.ServiceExecute(Sender: TService);
begin
  { Windows 2003 Server support. The problem is that you should always call
    StartServiceCtrlDispatcher (done in VCL) before calling CoRegisterClassObject
    (done from Application.Initialize). Win2003 now enforces this explicitly, but
    earlier versions did nothing if this was done improperly. }

  if not IsRunningInInstallMode then
    SvcMgr.Application.Initialize;

  while not Terminated do
  begin
    ServiceThread.ProcessRequests(false);
    Sleep(500);
  end;
end;
Aber das funktioniert bei mir so nicht.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat