Win32 C++如何获取当前应用程序服务名称

use*_*871 1 service winapi system

假设我的代码(DLL)已在作为服务运行的应用程序内运行.如何找到服务名称?我想要比在注册表中获取进程路径和枚举服务更优雅的方式.

Ste*_*eve 5

我建议使用GetCurrentProcessId来获取您正在运行的服务的进程ID.然后使用EnumServiceStatusEx枚举服务(无需自己使用注册表).

您可以将进程ID与ENUM_SERVICE_STATUS_PROCESS.ServiceStatusProcess.dwProcessId当前进程ID 匹配并获取名称.例如:

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

}
Run Code Online (Sandbox Code Playgroud)

有关错误处理的常用免责声明适用.我还没有正确检查缓冲区大小等.