2012-03-26 36 views
1

installiert ist. Ich schreibe eine C-Anwendung, die einen Windows-Dienst erstellt. Ich möchte prüfen, ob der Dienst installiert ist, bevor ich versuche, die Installationsfunktion aufzurufen, aber ich kann nicht herausfinden, wie ich ihn überprüfen kann.Überprüfen Sie, ob ein Dienst mit C

Ich habe den Code oben, um zu versuchen geschrieben:

DWORD InstallMyService() 
{ 
    char strDir[1024 + 1]; 
    SC_HANDLE schSCManager; 
    SC_HANDLE schService; 
    LPCTSTR lpszBinaryPathName; 

    if (GetCurrentDirectory(1024, strDir) == 0) 
    { 
     aff_error("GetCurrentDirectory"); 
     return FALSE; 
    } 
    strcat(strDir, "\\"MY_SERVICE_BIN_NAME); 
    if ((schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL) 
    { 
     printf("Error OpenSCManager : %d\n", GetLastError()); 
     return FALSE; 
    } 
    lpszBinaryPathName = strDir; 
    schService = CreateService(schSCManager, MY_SERVICE_NAME, MY_SERVICE_DESCRIPTOR, 
          SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, 
          lpszBinaryPathName, NULL, NULL, NULL, NULL, NULL); 
    if (schService == NULL) 
    { 
     printf("Error CreateService : %d\n", GetLastError()); 
     return FALSE; 
    } 
    CloseServiceHandle(schService); 
    return TRUE; 
} 

Aber dieser Code nicht erkennt, wenn der Dienst noch vorhandenen ist oder nicht. Hat jemand eine Idee, welche Funktion er anrufen soll? Ich habe viele Beiträge darüber gefunden, aber nicht in C, nur in C# oder VB.

Vielen Dank.

+0

Was versagt hat? Es ist der 'OpenSCManager' Aufruf oder der' GetServiceKeyName' Aufruf? – ChrisF

+0

Es scheint nur, wenn der Dienst noch erstellt wird, dass der OpenSCManager fehlschlägt. –

+0

Installieren Sie die Software selbst? Warum nicht einen Registrierungsschlüssel erstellen, der Ihnen sagt, ob er installiert ist oder nicht? Ich glaube nicht, dass Sie nach speziell installierten suchen können. Sie können versuchen, den Dienst mit "OpenService" zu öffnen, und wenn dies fehlschlägt, ist dies ein Anzeichen dafür, dass der Dienst nicht installiert ist, aber auch bedeutet, dass er nicht korrekt konfiguriert ist. – RedX

Antwort

2

Eine Möglichkeit immer zu CreateService() versuchen wäre, und wenn der Fehler Abfrage GetLastError() und überprüfen, ob es zu ERROR_SERVICE_EXISTS gleich ist:

SC_HANDLE service_handle = CreateService(...); 
if (0 == service_handle) 
{ 
    if (ERROR_SERVICE_EXISTS == GetLastError()) 
    { 
     /* Handle service already exists. */ 
    } 
    else 
    { 
     /* Handle failure. */ 
    } 
} 

Dies würde erfordern eine geringfügige Änderung an Ihrem Code von zwei Funktionen InstallService() und CheckService() mit einer Funktion (z le) EnsureServiceInstalled().

Oder könnten Sie die OpenService() Funktion verwenden, die mit GetLastError() Code von ERROR_SERVICE_DOES_NOT_EXIST fehl:

SC_HANDLE scm_handle = OpenSCManager(0, 0, GENERIC_READ); 

if (scm_handle) 
{ 
    SC_HANDLE service_handle = OpenService(scm_handle, 
              "the-name-of-your-service", 
              GENERIC_READ); 
    if (!service_handle) 
    { 
     if (ERROR_SERVICE_DOES_NOT_EXIST != GetLastError()) 
     { 
      fprintf(stderr, 
        "Failed to OpenService(): %d\n", 
        GetLastError()); 
     } 
     else 
     { 
      /* Service does not exist. */ 
      fprintf(stderr, "Service does not exist.\n"); 
     } 
    } 
    else 
    { 
     fprintf(stderr, "Opened service.\n"); 
     CloseServiceHandle(service_handle); 
    } 

    CloseServiceHandle(scm_handle); 
} 
else 
{ 
    fprintf(stderr, 
      "Failed to OpenSCManager(): %d\n", 
      GetLastError()); 
} 
+0

Ich habe versucht, nur eine Funktion zu haben, aber soweit der 'OpenSCManager'-Aufruf fehlschlägt, weiß ich nicht, ob 'ERROR_SERVICE_EXISTS' immer noch anwendbar sein kann. –

+0

Nein, die Funktion 'OpenSCManager()' hat keinen Bezug zu einem bestimmten Dienst. Können Sie den 'GetLastError()' Wert erhalten, nachdem 'OpenSCManager()' fehlgeschlagen ist. Dies zeigt an, was das Problem ist. – hmjd

+0

Hmm, das ist ziemlich komisch, jetzt ist der Aufruf von OpenSCManager in Ordnung, aber jetzt ist es der CreateService, der einen 1073-Fehler auslöst. Ich aktualisiere meinen Beitrag, um Ihnen den CreateService-Anruf anzuzeigen. –

Verwandte Themen