2013-05-20 1 views
1

Предполагая, что мой код (DLL) уже запущен внутри приложения, которое работает как служба. Как найти название службы? Я бы хотел более элегантный способ, чем получить путь к процессу и перечислить службы в реестре.Win32 C++ Как получить текущее приложение Имя службы

ответ

5

Я бы предложил использовать GetCurrentProcessId, чтобы получить идентификатор процесса службы, в которой вы работаете. Затем используйте EnumServiceStatusEx, чтобы перечислять службы (без необходимости использовать реестр самостоятельно).

Вы можете сопоставить идентификатор процесса с ENUM_SERVICE_STATUS_PROCESS.ServiceStatusProcess.dwProcessId с идентификатором текущего процесса и получить его имя. Например:

void enumerateServices(DWORD processId) 
{ 
    SC_HANDLE hSCM = OpenSCManager(NULL, NULL, 
     SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_CONNECT); 


    if (hSCM == NULL) 
    { 
     return; 
    } 
    DWORD bufferSize = 0; 
    DWORD requiredBufferSize = 0; 
    DWORD totalServicesCount = 0; 
    EnumServicesStatusEx(hSCM, 
     SC_ENUM_PROCESS_INFO, 
     SERVICE_WIN32, 
     SERVICE_STATE_ALL, 
     nullptr, 
     bufferSize, 
     &requiredBufferSize, 
     &totalServicesCount, 
     nullptr, 
     nullptr); 

    std::vector<BYTE> buffer(requiredBufferSize); 
    EnumServicesStatusEx(hSCM, 
     SC_ENUM_PROCESS_INFO, 
     SERVICE_WIN32, 
     SERVICE_STATE_ALL, 
     buffer.data(), 
     buffer.size(), 
     &requiredBufferSize, 
     &totalServicesCount, 
     nullptr, 
     nullptr); 

    LPENUM_SERVICE_STATUS_PROCESS services = 
     reinterpret_cast<LPENUM_SERVICE_STATUS_PROCESS>(buffer.data()); 
    for (unsigned int i = 0; i < totalServicesCount; ++i) 
    { 
     ENUM_SERVICE_STATUS_PROCESS service = services[i]; 
     if (service.ServiceStatusProcess.dwProcessId == processId) 
     { 
      // This is your service. 
      std::wcout << service.lpServiceName << L"PID: " << 
       service.ServiceStatusProcess.dwProcessId << std::endl; 
     } 
    } 

    (void)CloseServiceHandle(hSCM); 

} 

Применяются стандартные положения об отказе от ответственности. Я также неправильно проверил размеры буфера и т. Д.

+0

Большое спасибо! К сожалению, мой рейтинг не позволяет мне вознаграждать вас. – user1309871

+0

@ user1309871 Вы можете пометить ответ как принятый, если вам нравится его. В левой части ответа должен быть тик. – Steve

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