所謂服務程式,就像系統的一些服務一樣,能夠自動地啟動,並執行相應的操作;而且因為服務程式的在層次上和一般的應用程式不同,其能夠在系統啟動時就自動地執行,而不像一般的應用程式那樣一定要在登陸後才能執行,這些就是服務的一些好處了,如果你也想你的程式具有這樣的功能,那麼你就可以建立乙個服務應用程式了。下面就跟著我一步一步地教你怎麼去建立乙個服務應用程式吧。
主要使用到的函式(詳情請看msdn):
1.openscmanager:開啟服務管理器
winadvapi
sc_handle
winapi
openscmanager(
__in_opt lpcstr lpmachinename,//計算機名,null表示本地計算機
__in_opt lpcstr lpdatabasename,//資料庫名,預設值是services_active_database
__in dword dwdesiredaccess//訪問許可權
);引數dwdesiredaccess的取值有:
sc_manager_connect //可連線
sc_manager_create_service //能建立服務
sc_manager_enumerate_service
sc_manager_lock
sc_manager_query_lock_status
sc_manager_modify_boot_config
2.createservice:建立服務
winadvapi
sc_handle
winapi
createservice(
__in sc_handle hscmanager,//服務管理器
__in lpcstr lpservicename, //服務名
__in_opt lpcstr lpdisplayname,//顯示名字
__in dword dwdesiredaccess,//訪問許可權
__in dword dwservicetype,//服務型別,見msdn
__in dword dwstarttype,//怎麼啟動的?
__in dword dwerrorcontrol,
__in_opt lpcstr lpbinarypathname,//啟動路徑
__in_opt lpcstr lploadordergroup,
__out_opt lpdword lpdwtagid,
__in_opt lpcstr lpdependencies,
__in_opt lpcstr lpservicestartname,
__in_opt lpcstr lppassword
);3.其他函式
openservice:開啟服務
controlservice:控**務
deleteservice:刪除服務
registerservicectrlhandler:註冊服務控制項控制代碼,返回的是服務狀態型別
setservicestatus 設定服務狀態資訊
startservicectrldispatcher:在主線程裡面開始服務指派
下面通過例項說明一下:
》宣告成員變數:
service_status_handle m_hservicestatus;
》建立服務
bool install() //安裝服務
sc_handle hscm= openscmanager(null, null, sc_manager_create_service);
if (!hscm)//開啟服務管理器失敗
return false;
//建立服務
sc_handle hservice = ::createservice(
hscm, szservicename, szservicename,
service_all_access, service_win32_own_process,
service_demand_start, service_error_normal,
szfilepath, null, null, _t(""), null, null);
changeserviceconfig2(.............);//還可以配置服務的資訊
//最後要關閉控制代碼
::closeservicehandle(hservice);
::closeservicehandle(hscm);
bool uninstall()//解除安裝服務
<>新增服務主線程函式和控制函式。這裡呼叫 registerservicectrlhandler 來註冊服務的控制函式,這裡要設定status.dwcontrolsaccepted 為 service_accept_stop,否則你不能控制這個服務的狀態。
void winapi servicemain()
setservicestatus(hservicestatus, &status);
status.dwwin32exitcode = s_ok;
status.dwcheckpoint = 0;
status.dwwaithint = 0;
status.dwcurrentstate = service_running;
setservicestatus(hservicestatus, &status);
//模擬服務的執行,10後自動退出。應用時將主要任務放於此即可
int i = 0;
while (i < 10)
//status.dwcurrentstate = service_stopped;
setservicestatus(hservicestatus, &status);
logevent(_t("service stopped"));
}《》最後我們需要在主函式,或者應用程式的main函式裡面註冊,安裝,解除安裝服務。。。
加入下面的**:
parsecommandline(m_trcmdinfo);//得到命令引數lpcmdline
service_table_entry st =,};
if (stricmp(lpcmdline, "/install") == 0)
else if (stricmp(lpcmdline, "/uninstall") == 0)
else
用 VC 建立 Windows 服務程式
本文主要介紹了 openscmanager createservice openservice controlservice deleteservice registerservicectrlhandler setservicestatus startservicectrldispatcher等操作...
用 VC 建立 Windows 服務程式
本文主要介紹了 openscmanager createservice openservice controlservice deleteservice registerservicectrlhandler setservicestatus startservicectrldispatcher等操作...
VC 建立Windows服務程式2
本文主要介紹了 openscmanager createservice openservice controlservice deleteservice registerservicectrlhandler setservicestatus startservicectrldispatcher等操作...