あまり用途がないかもしれません。
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;
}
コメント