1

私のコード (DLL) が、サービスとして実行されるアプリケーション内で既に実行されていると仮定します。サービス名を見つける方法は?プロセス パスを取得してレジストリ内のサービスを列挙するよりも、より洗練された方法が必要です。

4

1 に答える 1

7

GetCurrentProcessIdを使用して、実行中のサービスのプロセス ID を取得することをお勧めします。次に、 EnumServiceStatusExを使用してサービスを列挙します (レジストリを自分で使用する必要はありません)。

ENUM_SERVICE_STATUS_PROCESS.ServiceStatusProcess.dwProcessIdからのプロセス ID を現在のプロセス 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 );

}

エラー処理に関する通常の免責事項が適用されます。また、バッファサイズなどを適切にチェックしていません。

于 2013-05-20T19:51:30.080 に答える