あまり用途がないかもしれません。
Windows サービスのファイルパスからサービス名を取得するコードです。
環境:QT5.5
インクルードファイル
1 | #include <windows.h> |
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | // ファイルパスからサービス名を取得する // ローカルコンピュータ上のサービス制御マネージャに接続 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; i<dwServiceCnt; i++ ) { // サービスを開く schService = OpenService(schSCManager, lss[i].lpServiceName, SERVICE_ALL_ACCESS); if ( NULL == schService ) { qDebug().noquote() << "error:" << GetLastError(); HeapFree(GetProcessHeap(), 0, lss); CloseServiceHandle(schSCManager); return false; } // サービスの詳細情報を取得 if ( !getSrvConfig(schService, 0, &strSrvFilePath) ) { HeapFree(GetProcessHeap(), 0, lss); CloseServiceHandle(schService); CloseServiceHandle(schSCManager); return false; } // ファイルパスが一致した場合は処理を終了 if ( strSrvFilePath.compare(strSrvFile, Qt::CaseInsensitive) == 0 ) { strSrvName = QString::fromWCharArray(lss[i].lpServiceName); CloseServiceHandle(schService); break; } CloseServiceHandle(schService); } HeapFree(GetProcessHeap(), 0, lss); CloseServiceHandle(schSCManager); } //=========================================================== // サービスの構成情報を取得 ※エラー処理省略してますので適時追加して下さい //=========================================================== bool classA::getSrvConfig(SC_HANDLE hService, DWORD *dwStartType, QString *strFilePath) { DWORD dwBytesNeeded=0, cbBufSize=0; DWORD dwRet; LPQUERY_SERVICE_CONFIG lpsc; // 必要な領域の情報を取得 if ( !QueryServiceConfig(hService,NULL,0,&dwBytesNeeded) ) { dwRet = GetLastError(); // Error if ( ERROR_INSUFFICIENT_BUFFER != dwRet ) { return false; } } // 領域を確保 lpsc = (LPQUERY_SERVICE_CONFIG)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, dwBytesNeeded); if ( NULL == lpsc ) { return false; } cbBufSize = dwBytesNeeded; // サービス構成情報を取得 if ( !QueryServiceConfig(hService,lpsc,cbBufSize,&dwBytesNeeded) ) { HeapFree(GetProcessHeap(), 0, lpsc); return false; } // Start Type を取得 if ( dwStartType != 0 ) { *dwStartType = lpsc->dwStartType; } // File Path if ( strFilePath != NULL ) { *strFilePath = QString::fromWCharArray(lpsc->lpBinaryPathName); } HeapFree(GetProcessHeap(), 0, lpsc); return true; } |
コメント