定义
Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这种服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。
相关API
OpenSCManager():打开服务控制管理器。
CreateService():创建系统服务。
OpenService():打开服务。
StartService():启动服务。
StopService():停止服务。
ControlService():控制服务。
SetServiceStatus():设置服务状态。
代码实例
#include <Windows.h>
//获取当前exe程序所在路径
char *GetExeFullPath()
{
char *path = new char[1024];
memset(path, 0, 1024);
if (GetModuleFileName(NULL, path, 1024) != 0)
{
return NULL;
}
return path;
}
//测试创建、启动系统服务
bool TestStartService()
{
//打开服务控制管理器
SC_HANDLE hScm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
if (hScm == NULL)
{
return false;
}
//创建系统服务,参数很多,可查看帮助文档
SC_HANDLE hService = CreateService(hScm, "MySerivce", "MyService", SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, GetExeFullPath(),
NULL, NULL, "", NULL, "");
if (hService == NULL)
{
return false;
}
//启动系统服务
if (StartService(hService, 0, NULL) == false)
{
return false;
}
//释放句柄
CloseServiceHandle(hScm);
CloseServiceHandle(hService);
return true;
}
//测试停止、卸载系统服务
bool TestStopService()
{
//获取系统服务控制管理器句柄
SC_HANDLE hScm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hScm == NULL)
{
return false;
}
//打开系统服务,获取服务句柄
SC_HANDLE hService = OpenService(hScm, "MyService", SERVICE_ALL_ACCESS);
if (hService == NULL)
{
return false;
}
//查询该系统服务是否正在运行,若在运行中则停止该服务
SERVICE_STATUS status;
QueryServiceStatus(hService, &status);
if (status.dwCurrentState == SERVICE_RUNNING)
{
ControlService(hService, SERVICE_CONTROL_STOP, &status);
//如果出错,则返回false
if (status.dwCurrentState != NO_ERROR)
{
return false;
}
}
//如果服务状态为已停止,则卸载该系统服务
if (status.dwCurrentState == SERVICE_STOPPED)
{
DeleteService(hService);
}
//释放句柄
CloseServiceHandle(hScm);
CloseServiceHandle(hService);
}
int main()
{
TestStartService();
//TestStopService();
return 0;
}
该程序主要实现了系统服务的创建、启动、停止、卸载等功能。
成功创建系统服务后,可以打开Windows系统中的SCM(服务控制管理器)进行查看。按住Ctrl+R打开运行窗口->输入“services.msc”打开服务窗口->在右侧服务列表中查找MyService名称的系统服务。