2009-01-31 9 views
1

J'ai des problèmes pour démarrer mon service sur mon pc. Mon code est basé sur cet article http://www.gamedev.net/reference/articles/article1899.aspcréer un service sur windows

Lorsque j'appelle installService depuis mon int main (int argc, char * argv []), il est enregistré avec succès (je peux le voir dans msconfig et services.msc). Cependant, il n'a pas commencé. Je démarre manuellement le service via services.msv et j'obtiens l'erreur "Erreur 2: le système ne trouve pas le fichier spécifié". Pourquoi est-ce? J'ai enregistré les services il n'y a pas plus d'une minute, mon HD externe est toujours sur (où ceci est actuellement stocké je vais déplacer une version de nondev à c:/quand c'est prêt) Qu'est-ce que je fais mal et y at-il un autre tutoriel? peut regarder (je ne trouve celui qui est lié via 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 } 
}; 
+0

Je suppose que vous avez déjà résolu cela, mais si vous ne l'avez toujours pas résolu (ou quelqu'un d'autre a un problème similaire). 'CreateService()' ne peut pas gérer les noms de fichiers avec des espaces, vous devez donc inclure le chemin complet dans Quotes '" "'. En tout cas, je serais intéressé de savoir si (et comment) vous avez résolu ce problème. –

+0

Est le chemin le chemin complet de l'exe comme il ne peut pas être relatif. – Lodle

+0

oui j'ai le chemin complet –

Répondre

1

peut-être que vous pouvez utiliser Process Monitor pour savoir ce qui ne va pas.

Démarrez-le et recherchez les résultats NAME NOT FOUND qui se produisent en relation avec le démarrage du service.

Questions connexes