あるサービスのファイルパスから、依存関係にあるサービスがあるかを取得する。
環境:QT5.5
インクルードファイル
#include
QString strService = "test"; // サービス名を指定
SC_HANDLE schSCManager;
SC_HANDLE schService;
DWORD dwStartType;
DWORD dwRet;
LPCTSTR lpSrvName = reinterpret_cast(strService.utf16());
int iRet;
// ローカルコンピュータ上のサービス制御マネージャに接続
schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if ( NULL == schSCManager ) {
// エラー処理
dwRet = GetLastError();
return false;
}
// サービスを開く
schService = OpenService(schSCManager, lpSrvName, SERVICE_ALL_ACCESS);
if ( NULL == schService ) {
// エラー処理
dwRet = GetLastError();
CloseServiceHandle(schSCManager);
return false;
}
LPENUM_SERVICE_STATUS lss;
DWORD dwBytesNeeded,cbBufSize, dwCount;
DWORD dwRet;
// 依存関係にあるサービスがあるか確認
if ( EnumDependentServices(schService, SERVICE_STATE_ALL, lss, 0, &dwBytesNeeded, &dwCount) ) {
// 依存するサービス無し
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return true;
// Error
} else {
dwRet = GetLastError();
if ( ERROR_MORE_DATA != dwRet ) {
// エラー処理
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return false;
}
}
// Allocate Buffer
lss = (LPENUM_SERVICE_STATUS)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwBytesNeeded);
if ( !lss ) {
// エラー処理
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return false;
}
cbBufSize = dwBytesNeeded;
// 依存関係にあるサービスを取得
if ( !EnumDependentServices(schService, SERVICE_ACTIVE, lss, cbBufSize, &dwBytesNeeded, &dwCount) ) {
// エラー処理
dwRet = GetLastError();
HeapFree(GetProcessHeap(), 0, lss);
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return false;
}
// 依存関係にあるサービスの名前を取得
QStringList strSrvNameList;
QString strServiceName;
ENUM_SERVICE_STATUS ess;
for ( DWORD i=0; i
コメント