Service - Installieren, ok. Doch wie weiter?



  • Hi,

    ich bin grad dabei einen Service zu schreiben. Das Einfügen in die Serviceliste ist kein Problem und funktioniert tadellos. Doch irgendwie ist mir jetzt noch nicht klar, woher der SCM eigentlich weiss, welches der Einstiegspunkt für den Service ist.
    Das ist das, was ich bisher gemacht habe:

    #define SERVICE_NAME "MyService"
    
    int installService()
    {
    	char Path[MAX_PATH];
    	if (!GetModuleFileName(NULL, Path, MAX_PATH))
    	{...}
    
    	SC_HANDLE hSc_Man = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
    	if (hSc_Man == NULL)
    	{...}
    
    	SC_HANDLE hSc_Service = CreateService(hSc_Man, SERVICE_NAME,
    		SERVICE_NAME,	SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, 
    		SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, Path,
    		0, 0, 0, 0, 0);
    
    	if (hSc_Service == NULL)
    	{...}
    
        CloseServiceHandle(hSc_Service);
    	CloseServiceHandle(hSc_Man);
    	...	
    } //installService()
    

    Ich hatte dann vor eine Klasse zu schreiben. So etwa:

    class MyService
    {
        public:
            static void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv);
            ...
    };
    

    Wie gesagt, woher weiss jetzt der SCM, dass er genau diese Funktion zum Start der Service aufrufen muss? 😕
    Ich wäre für einen Schubs, in die richtige Richtung dankbar.

    Thx, Maffe





  • Stimmt, danke. An den Beitrag hab ich nicht mehr gedacht. Jetzt drängt sich mir aber eine generelle Frage auf.
    Wie ist den der Ablauf beim Servicestart?
    Ich dachte, dass die main() nur zum Installieren oder Deinstallieren aufgerufen werden muss.

    Na ich werd mich noch mal durch den Beitrag arbeiten.


  • Mod

    Nein! Wenn Du die Installiererei separieren möchtest vom Run, dann musst DU das über entsprechende Befehlszeilenschalter machen.

    Ich verwende die Klassen von http://www.naughter.com. Diese MFC Klassen implementieren alles. Inkl. dem installieren des Services über die Service EXE.

    Wichtig: main wird immer aufgerufen. Wenn es der Service ist muss dieser StartServiceCtrlDispatcher aufrufen. Damit geht der Service "online"!



  • Gut. Danke schön. 😃


Anmelden zum Antworten