Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Service aus Anwendung installieren (https://www.delphipraxis.net/176877-service-aus-anwendung-installieren.html)

TUX_der_Pinguin 1. Okt 2013 15:48

Service aus Anwendung installieren
 
Hallo DPler,

ich versuche mich grade an einem kleinen Tool mit dem ich einen Service Steuern kann, also installieren, starten, stoppen und deinstallieren.

Bisher habe ich das manuell in der Kommandozeile erledigt.

Service installieren und starten
Code:
Service.exe /INSTALL
net start Service
Service stoppen und deinstallieren
Code:
net stop Service
Service.exe /UNINSTALL
Jetzt soll das ein kleines Tool machen, das klappt soweit auch alles nur habe ich gerade gemerkt das
wenn ich den Service installiere das Ereignis 'OnAfterInstall' des Service nicht ausgelöst wird.
Und ich habe keine Ahnung warum.

Hier die Funktion mit der in meinen Service installiere.
Delphi-Quellcode:
function InstallService(Machine, ServiceName, DisplayName, FilePath: String): Boolean;
var
  bCreated: Boolean;
  SCManHandle: SC_Handle;
  SvcHandle: SC_Handle;

begin
  //init
  bCreated := False;

  //Service Manager öffnen
  SCManHandle := OpenSCManager(PChar(Machine), nil, SC_MANAGER_ALL_ACCESS);
  if SCManHandle > 0 then begin

    //Service erstellen (Dienst installieren)
    SvcHandle := CreateService(SCManHandle, PChar(ServiceName), PChar(DisplayName), SC_MANAGER_CONNECT or SC_MANAGER_ENUMERATE_SERVICE or SC_MANAGER_MODIFY_BOOT_CONFIG or SC_MANAGER_QUERY_LOCK_STATUS or STANDARD_RIGHTS_READ, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, PChar(FilePath), nil, nil, nil, nil, nil);
    if SvcHandle > 0 then begin

      //Flag setzen
      bCreated := True;

      //Handle freigeben
      CloseServiceHandle(SvcHandle);
    end;{if}

    //Handle freigeben
    CloseServiceHandle(SCManHandle);
  end;{if}

  //Ergebnis
  result := bCreated;

end;{InstallService}

//Aufruf der Funktion
InstallService('', 'SvcMain', 'Mein Beispiel Service', 'C:\Temp\Service.exe');
Also irgendwo scheint es einen Unterschied zwischen meiner Funktion und der Kommandozeilen Variante mit "Service.exe /INSTALL" zu geben.

jaenicke 1. Okt 2013 19:29

AW: Service aus Anwendung installieren
 
Der Unterschied ist, dass der Aufruf von /install dein Programm startet, das dann selbst CreateService benutzt und auch die Events ausführt.
Wenn du nur CreateService benutzt, wird dein Dienst gar nicht erst dabei gestartet und daher kann dort auch kein Event ausgeführt werden.

Sprich:
Aufruf mit /install und /uninstall ist (allgemein) schon die beste Variante, da nur der Dienst selbst weiß was bei der Installation alles passieren muss. Das Starten und Stoppen hingegen kann man gut per API erledigen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz