本文主要介紹了 openscmanager、createservice、openservice、controlservice、deleteservice、registerservicectrlhandler、setservicestatus、startservicectrldispatcher等操作服務程式的主要幾個api的用法,具體的函式引數大家可以查閱msdn。
為什麼要使用服務應該程式呢?服務程式就像系統的一些服務一樣,能夠自動地啟動,並執行相應的操作;而且因為服務程式的在層次上和一般的應用程式不同,其能夠在系統啟動時就自動地執行,而不像一般的應用程式那樣一定要在登陸後才能執行,這些就是服務的一些好處了,如果你也想你的程式具有這樣的功能,那麼你就可以建立乙個服務應用程式了。下面就跟著我一步一步地教你怎麼去建立乙個服務應用程式吧。
二、定義全域性函式變數。這裡主要是設定服務控制代碼和狀態。
01.
bool
isinstalled();
02.
bool
install();
03.
bool
uninstall();
04.
void
logevent(
lpctstr
pszformat, ...);
05.
void
winapi servicemain();
06.
void
winapi servicectrl(
dword
dwopcode);
07.
08.
tchar
szservicename = _t(
"servicetest"
);
09.
bool
binstall;
10.
service_status_handle
hservicestatus;
11.
service_status status;
12.
dword
dwthreadid;
三、新增init初始化函式。
01.
void
init()
02.
四、新增安裝和刪除服務函式。這裡主要是用到了四個函式 openscmanager 和 createservice。openscmanager 用於開啟服務控制管理器;createservice 用於建立服務;openservice用於開啟已有的服務,返回該服務的控制代碼;controlservice則用於控制已開啟的服務狀態,這裡是讓服務停止後才刪除;deleteservice 用於刪除指定服務。
01.
bool
install();
02.
18.
19.
20.
bool
uninstall();
21.
五、新增服務主線程函式和控制函式。這裡呼叫 registerservicectrlhandler 來註冊服務的控制函式,這裡要設定status.dwcontrolsaccepted 為 service_accept_stop,否則你不能控制這個服務的狀態。
01.
void
winapi servicemain()
02.
14.
setservicestatus(hservicestatus, &status);
15.
16.
status.dwwin32exitcode = s_ok;
17.
status.dwcheckpoint = 0;
18.
status.dwwaithint = 0;
19.
status.dwcurrentstate = service_running;
20.
setservicestatus(hservicestatus, &status);
21.
22.
//模擬服務的執行,10後自動退出。應用時將主要任務放於此即可
23.
int
i = 0;
24.
while
(i < 10)
25.
29.
//
30.
31.
status.dwcurrentstate = service_stopped;
32.
setservicestatus(hservicestatus, &status);
33.
logevent(_t(
"service stopped"
));
34.
}
六、在主線程函式裡註冊控制函式和程式執行主體。這裡主要是說明這就是程式的執行體。
01.
void
winapi servicemain()
02.
13.
14.
…
15.
}
七、最後,要在main函式裡註冊新增安裝、刪除、註冊主函式。
view source
print?
01.
int
apientry winmain(
hinstance
hinstance,
02.
hinstance
hprevinstance,
03.
lpstr
lpcmdline,
04.
int
ncmdshow)
05.
,
11.
12.
};
13.
14.
if
(stricmp(lpcmdline,
"/install"
) == 0)
15.
18.
else
if
(stricmp(lpcmdline,
"/uninstall"
) == 0)
19.
22.
else
23.
28.
}
29.
return
0;
30.
}
八、總結。其實做乙個服務程式並不難,主要是懂得程式的執行體放於**?和註冊程式的主函式和註冊控制函式,如果這兩個沒有註冊的話,你就程式就不知道如何去控制了。status.dwcontrolsaccepted = service_accept_stop;這個也重要,如果你沒有設定的話,那麼服務就不會受你控制了。
用 VC 建立 Windows 服務程式
本文主要介紹了 openscmanager createservice openservice controlservice deleteservice registerservicectrlhandler setservicestatus startservicectrldispatcher等操作...
用 VC 建立 Windows 服務程式
本文主要介紹了 openscmanager createservice openservice controlservice deleteservice registerservicectrlhandler setservicestatus startservicectrldispatcher等操作...
VC 建立Windows服務
我在開發的時候用到了dll裡面的函式,開始的時候採用的靜態匯入的方法,但是發現服務開機啟動以後就死掉了,這裡不是dll路徑的問題。沒辦法,自己只得用動態匯入的方法,還好,服務自動開機執行了,還算正常吧。當然,我這裡的初始化引數已經設定好了,在dos命令裡面安裝完成後,你會發現,那個框,我已經替你選上...