所谓服务程序,就像系统的一些服务一样,能够自动地启动,并执行相应的操作;而且因为服务程序的在层次上和一般的应用程序不同,其能够在系统启动时就自动地运行,而不像一般的应用程序那样一定要在登陆后才能运行,这些就是服务的一些好处了,如果你也想你的程序具有这样的功能,那么你就可以建立一个服务应用程序了。下面就跟着我一步一步地教你怎么去创建一个服务应用程序吧。
主要使用到的函数(详情请看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()//卸载服务
{
..................
OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
//打开服务
OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);
//停止服务
ControlService(hService, SERVICE_CONTROL_STOP, &status);
//删除服务
DeleteService(hService);
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
}
<>添加服务主线程函数和控制函数。这里调用 RegisterServiceCtrlHandler 来注册服务的控制函数,这里要设置status.dwControlsAccepted 为 SERVICE_ACCEPT_STOP,否则你不能控制这个服务的状态。
void WINAPI ServiceMain()
{
// Register the control request handler
status.dwCurrentState = SERVICE_START_PENDING;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;//这个要使用,否则你不能控制
//注册服务控制
hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);
if (hServiceStatus == NULL)
{
LogEvent(_T("Handler not installed"));
return;
}
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)
{
Sleep(1000);
i++;
}
//
status.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hServiceStatus, &status);
LogEvent(_T("Service stopped"));
}
《》最后我们需要在主函数,或者应用程序的Main函数里面注册,安装,卸载服务。。。
加入下面的代码:
。。。。。。。。。。。。。。。。
ParseCommandLine(m_trCmdInfo);//得到命令参数lpCmdLine
SERVICE_TABLE_ENTRY st[] =
{
{ szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ NULL, NULL }
};
if (stricmp(lpCmdLine, "/install") == 0)
{
Install();
}
else if (stricmp(lpCmdLine, "/uninstall") == 0)
{
Uninstall();
}
else
{
StartServiceCtrlDispatcher(st);
}