erstellen Sie service auf windows

Ich habe Probleme beim starten meines service auf meinem pc. Mein code basiert auf diesem Artikel http://www.gamedev.net/reference/articles/article1899.asp

Wenn ich Anrufe, installService von meiner int main(int argc, char *argv[]), ist es erfolgreich registriert (ich sehe es in msconfig und services.msc). Aber es hat nicht gestartet. Ich den Dienst manuell starten über die Dienste.msv und ich bekomme die Fehlermeldung "Fehler 2: system kann nicht die angegebene Datei gefunden". Warum ist das so? ich habe mich registriert die Dienste dann nicht mehr eine min vor, meine externe HD ist immer noch auf (wo diese derzeit gespeichert. ich mache eine nondev version auf c:/, wenn seine ready), Was mache ich falsch und gibt es noch ein tutorial, die ich mir ansehen kann (ich habe nur einen gefunden, miteinander verbunden über google)

#define srvName "MyTestService_01312009"

void installService(char*path)
{
    SC_HANDLE handle = ::OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
    SC_HANDLE service = ::CreateService(
        handle,
        srvName,
        "MyTestService_01312009b",
        GENERIC_READ | GENERIC_EXECUTE,
        SERVICE_WIN32_OWN_PROCESS,
        SERVICE_AUTO_START,
        SERVICE_ERROR_IGNORE,
        path,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL
    );
}
void uninstallService()
{
    SC_HANDLE handle = ::OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );//?
    SC_HANDLE service = ::OpenService( handle, srvName, DELETE );
    if( service != NULL )
    {
        //remove the service!
        ::DeleteService( service );
    }
}

SERVICE_STATUS_HANDLE hStatus;
SERVICE_STATUS status;

/*
if( ::StartServiceCtrlDispatcher( dispatchTable ) == 0 )
{
    //if this fails, it's probably because someone started us from
    //the command line.  Print a message telling them the "usage"
}
*/
void WINAPI ServiceCtrlHandler( DWORD control )
{
    switch( control )
    {
    case SERVICE_CONTROL_SHUTDOWN:
    case SERVICE_CONTROL_STOP:
        //do shutdown stuff here

        status.dwCurrentState = SERVICE_STOPPED;
        status.dwWin32ExitCode = 0;
        status.dwCheckPoint = 0;
        status.dwWaitHint = 0;
        break;
    case SERVICE_CONTROL_INTERROGATE:
        //just set the current state to whatever it is...
        break;
    }

    ::SetServiceStatus( hStatus, &status );
}
void WINAPI ServiceDispatch( DWORD numArgs, char **args )
{
    //we have to initialize the service-specific stuff
    memset( &status, 0, sizeof(SERVICE_STATUS) );
    status.dwServiceType = SERVICE_WIN32;
    status.dwCurrentState = SERVICE_START_PENDING;
    status.dwControlsAccepted = SERVICE_ACCEPT_STOP;

    hStatus = ::RegisterServiceCtrlHandler( srvName, &ServiceCtrlHandler );

    //more initialization stuff here
    FILE *f = fopen("c:/testSrv.bin", "wb");
    ::SetServiceStatus( hStatus, &status );
}
SERVICE_TABLE_ENTRY dispatchTable[] =
{
    { srvName, &ServiceDispatch },
    { NULL, NULL }
};
Sind Sie den Aufruf von StartServiceCtrlDispatcher, RegisterServiceCtrlHandler, und SetServiceStatus, vom service, wenn es gestartet wird?
Ist der Pfad den vollständigen Pfad zu der exe, wie es kann nicht relativ sein.
ja ich habe den vollständigen Pfad
ich bin mir nicht sicher, was du meinst
Der code in deiner Frage nur registriert, eine ausführbare Datei mit dem angegebenen as a service mit dem Namen MyTestService_01312009b. Wenn Sie diese ausführbare Datei startet, er muss die oben genannten Funktionen in Einklang mit der Win32-Regeln für Dienstleistungen. So rufen Sie die oben genannten Funktionen aus der service?

InformationsquelleAutor | 2009-01-31

Schreibe einen Kommentar