指定のWindowsサービスを停止する。
環境:QT5.5
インクルードファイル
1 2 | #include <windows.h> #include <QString> |
コード
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 | SC_HANDLE OpenSCManager; SC_HANDLE schService; SERVICE_STATUS_PROCESS ssp; DWORD dwBytesNeeded; DWORD dwRet; QString strService = "testService"; // 停止するサービス名 LPCTSTR lpSrvName = reinterpret_cast<LPCTSTR>(strService.utf16()); //*** ローカルコンピュータ上のサービス制御マネージャに接続 schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if ( NULL == schSCManager ) { qDebug().noquote() << "Error:" << GetLastError() << endl; return false; } //*** サービスに接続 schService = OpenService(schSCManager, lpSrvName, SERVICE_ALL_ACCESS); if ( NULL == schService ) { CloseServiceHandle(schSCManager); qDebug().noquote() << "Error:" << GetLastError() << endl; return false; } //*** サービスの状態を確認 if ( !QueryServiceStatusEx(schService, SC_STATUS_PROCESS_INFO, (LPBYTE)&ssp, sizeof(SERVICE_STATUS_PROCESS), &dwBytesNeeded) ) { CloseServiceHandle(schService); CloseServiceHandle(schSCManager); qDebug().noquote() << "Error:" << GetLastError() << endl; return false; } // サービスが停止している場合は処理終了 if ( SERVICE_STOPPED == ssp.dwCurrentState ) { CloseServiceHandle(schService); CloseServiceHandle(schSCManager); qInfo().noquote() << "Service is stopped." << endl; return true; } // サービスが終了待ちの場合 DWORD dwStartTime = GetTickCount(); DWORD dwTimeout = 30000; while ( SERVICE_STOP_PENDING == ssp.dwCurrentState ) { qInfo().noquote() << "Service stop pending." << endl; Sleep( ssp.dwWaitHint/10 ); // サービスの状態を確認する if ( !QueryServiceStatusEx(schService, SC_STATUS_PROCESS_INFO, (LPBYTE)&ssp, sizeof(SERVICE_STATUS_PROCESS), &dwBytesNeeded) ) { CloseServiceHandle(schService); CloseServiceHandle(schSCManager); qDebug().noquote() << "Error:" << GetLastError() << endl; return false; } // サービス停止(正常終了 if ( SERVICE_STOPPED == ssp.dwCurrentState ) { CloseServiceHandle(schService); CloseServiceHandle(schSCManager); qInfo().noquote() << "Service is Stopped." << endl; writeLog(StrMsg, LOG_INFO); return true; } // タイムアウト if ( GetTickCount() - dwStartTime > dwTimeout ) { CloseServiceHandle(schService); CloseServiceHandle(schSCManager); qInfo().noquote() << "Service stop timed out." << endl; return false; } } //*** サービス停止処理 if ( !ControlService(schService, SERVICE_CONTROL_STOP, (LPSERVICE_STATUS)&ssp) ) { CloseServiceHandle(schService); CloseServiceHandle(schSCManager); qDebug().noquote() << "Error:" << GetLastError() << endl; return false; } // サービスが停止するまで待つ while ( SERVICE_STOPPED != ssp.dwCurrentState ) { Sleep( ssp.dwWaitHint ); // サービスの状態確認 if ( !QueryServiceStatusEx(schService, SC_STATUS_PROCESS_INFO, (LPBYTE)&ssp, sizeof(SERVICE_STATUS_PROCESS), &dwBytesNeeded) ) { CloseServiceHandle(schService); CloseServiceHandle(schSCManager); qDebug().noquote() << "Error:" << GetLastError() << endl; return false; } // サービス停止(正常終了 if ( SERVICE_STOPPED == ssp.dwCurrentState ) { CloseServiceHandle(schService); CloseServiceHandle(schSCManager); qInfo().noquote() << "Service stopped successfully." << endl; break; } // タイムアウト if ( GetTickCount() - dwStartTime > dwTimeout ) { CloseServiceHandle(schService); CloseServiceHandle(schSCManager); qInfo().noquote() << "Service stop timed out." << endl; return false; } } CloseServiceHandle(schService); CloseServiceHandle(schSCManager); return true; |
コメント