スポンサーリンク
ホーム»Qt逆引きマニュアル»Windows関連» 指定のWindowsサービスを停止

指定のWindowsサービスを停止

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

指定の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;

コメント

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