c - Opret Windows-service uden Visual Studio

Indlæg af Hanne Mølgaard Plasc

Problem



Så det er ret trivielt at oprette en Windows-tjeneste ved hjælp af Visual Studio. Mit spørgsmål er lidt dybere, hvad der faktisk gør en eksekverbar installerbar som en service & hvordan man skriver en tjeneste som en straight C ansøgning Jeg kunne ikke finde mange referencer herom, men jeg formoder at der skal være en grænseflade, jeg kan implementere, så min .exe kan installeres som en tjeneste.

Bedste reference


Oprettelse af din eksekverbare som en tjeneste er en del af det, men realistisk bliver det normalt håndteret af uanset installationsprogrammet du bruger. Du kan bruge kommandolinjens SC-værktøj under testning (eller hvis du ikke har brug for et installationsprogram).


Det vigtigste er, at dit program skal kalde StartServiceCtrlDispatcher () ved opstart. Dette forbinder din service med servicekontrolllederen og opretter en ServiceMain-rutine, som er dit hovedindtastningssted for tjenester.


ServiceMain (du kan kalde det, uanset hvad du faktisk synes, men det synes altid at være ServiceMain) skal du ringe til RegisterServiceCtrlHandlerEx () for at definere en tilbagekaldelsesrutine, så OS kan underrette din tjeneste, når visse hændelser opstår.


Her er nogle uddrag af en tjeneste, jeg skrev for nogle år siden:


oprettet som service:


SERVICE\_TABLE\_ENTRY ServiceStartTable[] =
{
   { "ServiceName", ServiceMain },
   { 0, 0 }
};

if (!StartServiceCtrlDispatcher(ServiceStartTable))
{
   DWORD err = GetLastError();
   if (err == ERROR\_FAILED\_SERVICE\_CONTROLLER\_CONNECT)
      return false;
}


ServiceMain:


void WINAPI ServiceMain(DWORD, LPTSTR*)
{
    hServiceStatus = RegisterServiceCtrlHandlerEx("ServiceName", ServiceHandlerProc, 0);


servicehåndterer:


DWORD WINAPI ServiceHandlerProc(DWORD ControlCode, DWORD, void*, void*)
{
    switch (ControlCode)
    {
    case SERVICE\_CONTROL\_INTERROGATE :
        // update OS about our status
    case SERVICE\_CONTROL\_STOP :
        // shut down service
    }

    return 0;
}

Andre referencer 1


Dybest set er der nogle registreringsindstillinger, du skal indstille samt nogle grænseflader til implementering.


Tjek dette: http://msdn.microsoft.com/en-us/library/ms685141.aspx[4]


Du er interesseret i SCM (Service Control Manager).

Andre referencer 2


Håber dette hjælper:


http://support.microsoft.com/kb/251192[5]


Det lader til, at du simpelthen behøver at køre denne exe mod en binær eksekverbar for at registrere det som en tjeneste.

Andre referencer 3


Jeg ved, at jeg er lidt sent til festen, men jeg har for nylig haft det samme spørgsmål, og måtte kæmpe gennem interwebs på udkig efter svar.


Det lykkedes mig at finde denne artikel i MSDN, der faktisk ligger grunden. Jeg endte med at kombinere mange af filerne her i en enkelt exe, der indeholder alle de kommandoer, jeg har brug for, og tilføjes i min egen 'void run ()' -metode, der loops for hele livet for tjenesten til mine egne behov.


Dette ville være en god start til en anden med netop dette spørgsmål, så for fremtidige brugere derude, tjek det ud:


Den komplette serviceprøve
http://msdn.microsoft.com/en-us/library/bb540476(VS.85).aspx[6]