Win32 Service的簡單封裝

2021-09-05 17:46:51 字數 3226 閱讀 4400

前段時間學習windows程式設計,剛好學到win32 service,於是寫了兩個簡單的類:baseservice和servicectrl。雖然功能比較簡單,但是也能適用於大多數情況。下面介紹一下簡單用法,如果你剛好需要寫一些簡單的服務程式,這兩個類也許能派上用場:

1. baseservice

baseservice.h 1

#ifndef base_service_h2

#define base_service_h3

4class

baseservice 

10bool parsestandardargs(

intargc, 

char*

argv);11

bool isinstalled();12

bool install();13

bool uninstall();14

bool start();

15private

:16virtual 

void

run() =0

;17virtual bool oninitialize() 

18virtual 

void

onstop() {}

19virtual 

void

onpause() {}

20virtual 

void

oncontinue() {}

21virtual 

void

oninterrogate() {}

22virtual 

void

onshutdown() {}

23virtual 

void

onusercontrol(dword dwcontrol) {}24

...25

};26

27#endif

/*base_service_h*/

要實現自己的服務類只需從baseservice繼承並且override相關的virtual函式即可,下面示範乙個beepservice類,該服務只是簡單地每隔2秒beep一下,為了簡單所有**均放在.h檔案中:

beepservice.h 1

#ifndef beep_service_h2

#define beep_service_h3

4#include 

"baseservice.h"

5

6class

beepservice : 

public

baseservice 12

13virtual 

void

onstop() 

14virtual 

void

onpause() 

15virtual 

void

oncontinue() 

16virtual 

void

run() 23

}24private

:25volatile

bool m_bpaused;

26volatile

bool m_brunning;27

};28

29#endif

/*beep_service_h*/

通常來說只須要override上面的4個virtual函式就ok了:

在run()中進行實際的工作,onstop(),onpause(),oncontinue()則是為了響應service control manager的控制。

test.cpp 1

#include 

<

windows.h

>

2#include 

<

tchar.h

>

3#include 

<

stdio.h

>

4#include 

"beepservice.h"

5

6int

main(

intargc, 

char*

argv)  

else

17 }18

return0

;19}

假設編譯後生成的exe檔案為beep.exe,則在命令列中可以如下使用:

(1). beep -i    安裝service(安裝以後系統執行時會自動啟動)

(2). beep -u   解除安裝service(如果service正在執行,則先停止service再解除安裝)

baseserviced 的parsestandardargs正是用來解析上述兩個命令。

2. servicectrl

雖然windows自帶的service control manager可以控**務程式,但是很多時候我們都需要用**控制,這就用到servicectrl類,該類的介面如下:

servicectrl.h 1

#ifndef service_ctrl_h2

#define service_ctrl_h3

4class

servicectrl ;17

18#endif

/*service_ctrl_h*/

介面比較直觀沒什麼好說的,看下面的示例**:

test.cpp

1#include 

<

windows.h

>

2#include 

<

tchar.h

>

3#include 

<

stdio.h

>

4#include 

<

exception

>

5#include 

"beepservice.h"

6#include 

"servicectrl.h"

7

8int

main(

intargc, 

char*

argv)  

else

27} 

catch

(std::exception &

e) 30return0

;31}

源**:

php自動執行 win32service功能

什麼 windows服務 windows 服務 即,以前的 nt 服務 使您能夠建立在它們自己的 windows 會話中可長時間執行的可執行應用程式 這些服務可以在計算機啟動時自動啟動,可以暫停和重新啟動而且不顯示任何使用者介面。這使服務非常適合在伺服器上使用,或任何時候,為了不影響在同一臺計算 機...

簡單的WIN32視窗封裝

封裝視窗物件。注意。有些命名我是直接複製win32api的,偷懶了 本來是想直接用虛函式來處理訊息的,但是訊息很多,寫的會很吃力,所以採用類似mfc的訊息對映,現在記憶體是很富裕的,不用擔心虛函式表會占用大量記憶體,個人建議是採用虛函式的,我這裡偷偷懶。該類主要作用 訊息處理函式呼叫該類的靜態函式w...

Win32中簡單實現串列埠通訊

宣告 本文的串列埠通訊是主機向從機傳送資料。step 1 handle m hcomm createfile com3 串列埠名,根據實際情況而定 generic read generic write,0,null,open existing,0 if invalid handle value m ...