スポンサーリンク

Qt:Windows サービスのファイルパスからサービス名を取得

当サイトは、アフィリエイト広告を利用しています

あまり用途がないかもしれません。
Windows サービスのファイルパスからサービス名を取得するコードです。

環境:QT5.5

インクルードファイル

#include 

コード

 
    // ファイルパスからサービス名を取得する

    // ローカルコンピュータ上のサービス制御マネージャに接続
    SC_HANDLE   schSCManager;
    schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if ( NULL == schSCManager ) {
	qDebug().noquote() << "error:" << GetLastError();
        return false;
    }

    // ドライバーサービスの一覧を取得する
    LPENUM_SERVICE_STATUS lss;
    DWORD dwBytesNeeded, dwServiceCnt, cbBufSize;
    if ( !EnumServicesStatus(schSCManager,
                            SERVICE_DRIVER,
                            SERVICE_STATE_ALL,
                            NULL,
                            0,
                            &dwBytesNeeded,
                            &dwServiceCnt,
                            0) ) {
        dwRet = GetLastError();
        // Error
        if ( ERROR_MORE_DATA != dwRet ) {
	    qDebug().noquote() << "error:" << GetLastError();
            CloseServiceHandle(schSCManager);
            return false;
        }
    }

    // 必要な領域を確保する
    lss = (LPENUM_SERVICE_STATUS)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwBytesNeeded);
    if ( NULL == lss ) {
        CloseServiceHandle(schSCManager);
        return false;
    }

    cbBufSize = dwBytesNeeded;

    // ドライバーサービス一覧を取得する
    if ( !EnumServicesStatus(schSCManager,
                            SERVICE_DRIVER,
                            SERVICE_STATE_ALL,
                            lss,
                            cbBufSize,
                            &dwBytesNeeded,
                            &dwServiceCnt,
                            0) ) {     
	qDebug().noquote() << "error:" << GetLastError();     
        HeapFree(GetProcessHeap(), 0, lss);
        CloseServiceHandle(schSCManager);
        return false;
    }

    // サービス名からファイルパスを抽出、該当サービスを探す
    QString strFilePath = "C:/Program Files/test/test.exe"); // 探す対象サービスのファイル絶対パス
    QString strSrvName;
    QString strSrvFilePath;
    SC_HANDLE schService;
    for ( DWORD i=0; idwStartType;
    }

    // File Path
    if ( strFilePath != NULL ) {
        *strFilePath = QString::fromWCharArray(lpsc->lpBinaryPathName);
    }

    HeapFree(GetProcessHeap(), 0, lpsc);

    return true;
}

コメント

タイトルとURLをコピーしました