2012-03-26 4 views
1

Я пишу приложение C, которое создает службу Windows. Я хочу проверить, установлена ​​ли служба, прежде чем пытаться вызвать функцию установки, но мне не удается найти, как ее проверить.Проверьте, установлены ли службы с помощью C

Я написал код, чтобы попробовать:

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; 
} 

Но этот код не обнаружить, если услуга еще существует или нет. У кого-то есть идея, какую функцию вызывать? Я нашел много сообщений об этом, но не в C, только в C# или VB.

спасибо.

+0

Что неисправного? Это вызов «OpenSCManager» или вызов «GetServiceKeyName»? – ChrisF

+0

Кажется, только когда служба все еще создана, сбой OpenSCManager. –

+0

Вы сами устанавливаете программное обеспечение? Почему бы не создать раздел реестра, который говорит вам, установлен ли он или нет? Я не думаю, что вы можете запросить установку специально. Вы можете попробовать открыть службу с помощью «OpenService», и если это не удается, это индикатор того, что служба не установлена, но также может означать, что она настроена неправильно. – RedX

ответ

2

возможность будет всегда пытаться CreateService() и если отказ запроса GetLastError() и проверить, если он равен ERROR_SERVICE_EXISTS:

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

Это будет требуют небольшого изменения вашего кода от двух функций InstallService() и CheckService() до одной функции (для примера le) EnsureServiceInstalled().

Или, вы можете использовать функцию OpenService(), которая подведет с GetLastError() кодом ERROR_SERVICE_DOES_NOT_EXIST:

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

Я пробовал иметь только одну функцию, но, поскольку вызов 'OpenSCManager' терпит неудачу, я не знаю, может ли' ERROR_SERVICE_EXISTS' быть применимым? –

+0

Нет, функция '' OpenSCManager() 'не связана с конкретной службой. Можете ли вы получить значение «GetLastError()» после того, как «OpenSCManager()» завершится с ошибкой. Это покажет, в чем проблема. – hmjd

+0

Хм, это довольно странно, теперь вызов OpenSCManager в порядке, но теперь это CreateService, который выдает ошибку 1073. Я обновлю сообщение, чтобы показать вам вызов CreateService. –

Смежные вопросы