資源簡介
學習如何編寫Windows Service 服務程序的很好例子,可以直接在例子的基礎上修改并編譯運行,實用性很強.
運行環境: Windows NT/2000/XP
例子程序示例了如何在Windows NT/2000/XP系統中create, start, stop, 和 delete serverice
程序使用了如下的 API命令:
OpenSCManager()
CloseServiceHandle()
CreateService()
OpenService()
SetServiceStatus()
DeleteService()
RegisterServiceCtrlHandler()
StartServiceCtrlDispatcher()
LPSERVICE_MAIN_FUNCTION
LPHANDLER_FUNCTION
程序把所有的命令寫入記錄文件C:\DemoService.txt,可以試著以administrator和guest等權限運行程序.
程序有兩種運行模式:
Service.exe (無參數) GUI運行
Service.exe /Service 服務模式運行

代碼片段和文件信息
//?cService.cpp:?implementation?of?the?cService?class.
//
//////////////////////////////////////////////////////////////////////
#include?“stdafx.h“
#include?“Service.h“
#include?“cService.h“
#ifdef?_DEBUG
#undef?THIS_FILE
static?char?THIS_FILE[]=__FILE__;
#define?new?DEBUG_NEW
#endif
extern?void?Output(CString?Out);
//?global?instance?of?Service
cService?g_Service;
cService::cService()
{
}
cService::~cService()
{
}
//?return?Errorcode?or?0
//?Install?the?service?when?user?clicks?the?Create?button
DWORD?cService::Create()
{
SC_HANDLE?hdlSCM?=?OpenSCManager(0?0?SC_MANAGER_CREATE_SERVICE);
CString?Calling?=?::GetCommandLine();
Calling?+=?“?/Service“;
if?(hdlSCM?==?0)?return?::GetLastError();
?
SC_HANDLE?hdlServ?=?CreateService(
hdlSCM????????????????????//?SCManager?database?
ServiceName???????????????//?name?of?service?
ServiceDisplayName????????//?service?name?to?display?
STANDARD_RIGHTS_REQUIRED??//?desired?access?
SERVICE_WIN32_OWN_PROCESS?//?service?type?
SERVICE_DEMAND_START??????//?start?type?
SERVICE_ERROR_NORMAL??????//?error?control?type?
Calling???????????????????//?service‘s?binary?Path?name
0??????????????????????//?no?load?ordering?group?
0??????????????????????//?no?tag?identifier?
0??????????????????????//?no?dependencies?
0??????????????????????//?LocalSystem?account?
0);?????????????????????//?no?password?
?
DWORD?Ret?=?0;
if?(!hdlServ)?Ret?=?::GetLastError();
????CloseServiceHandle(hdlServ);
return?Ret;
}
//?return?Errorcode?or?0
//?Uninstall?the?service?when?user?clicks?the?Delete?button
DWORD?cService::Delete()
{
SC_HANDLE?hdlSCM?=?OpenSCManager(0?0?STANDARD_RIGHTS_REQUIRED);
?
if?(!hdlSCM)?return?::GetLastError();
SC_HANDLE?hdlServ?=?OpenService(hdlSCM?ServiceName?DELETE);
DWORD?Ret?=?0;
if?(!DeleteService(hdlServ))?Ret?=?::GetLastError();
CloseServiceHandle(hdlServ);
return?Ret;
}
//?return?Errorcode?or?0
//?Start?the?service?when?user?clicks?the?Start?button
DWORD?cService::Start()
{
SC_HANDLE?hdlSCM?=?OpenSCManager(0?0?STANDARD_RIGHTS_REQUIRED);
?
if?(!hdlSCM)?return?::GetLastError();
SC_HANDLE?hdlServ?=?OpenService(hdlSCM?ServiceName?SERVICE_START);
DWORD?Ret?=?0;
if?(!StartService(hdlServ?0?0))?Ret?=?::GetLastError();
CloseServiceHandle(hdlServ);
return?Ret;
}
//?return?Errorcode?or?0
//?Stop?the?service?when?user?clicks?the?Stop?button
DWORD?cService::Stop()
{
SC_HANDLE?hdlSCM?=?OpenSCManager(0?0?STANDARD_RIGHTS_REQUIRED);
?
if?(!hdlSCM)?return?::GetLastError();
SC_HANDLE?hdlServ?=?OpenService(hdlSCM?ServiceName?SERVICE_STOP);
SERVICE_STATUS?ServStat;
DWORD?Ret?=?0;
if?(!ControlService(hdlServ?SERVICE_CONTROL_STOP?&ServStat))?Ret?=?::GetLastError();
CloseServiceHandle(hdlServ);
return?Ret;
}
//?this?function?must?be?in?global?namespace?(Windows?API?callback)
void?ApiServiceMainStarter(DWORD?argc?L
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2003-07-17?20:55??RES\
?????文件?????????399??2000-11-20?16:42??RES\Service.rc2
?????文件????????1078??2000-11-20?16:42??RES\Service.ico
?????文件?????????853??2003-07-17?20:58??__Read_Me.txt
?????文件????????7075??2003-07-17?21:47??cService.cpp
?????文件?????????904??2003-06-30?14:37??cService.h
?????文件?????????777??2003-06-30?15:00??resource.h
?????文件????????1175??2003-06-30?15:49??Service.clw
?????文件????????2006??2003-06-30?15:41??Service.cpp
?????文件????????4302??2003-06-30?14:39??Service.dsp
?????文件?????????539??2000-11-20?16:42??Service.dsw
?????文件????????1335??2000-11-20?16:42??Service.h
?????文件????????5295??2003-07-17?21:51??Service.rc
?????文件????????8000??2003-06-30?15:47??ServiceDlg.cpp
?????文件????????1369??2003-06-30?15:18??ServiceDlg.h
?????文件?????????209??2000-11-20?16:42??StdAfx.cpp
?????文件?????????999??2000-11-20?16:42??StdAfx.h
評論
共有 條評論