通过执行以下操作,我创建了一个运行良好的Windows服务。
WebClient
正如您所看到的,我将访问权限指定为 SC_HANDLE hService = ::CreateService(*m_ServiceConfig, // SCM database
name.c_str(), // name of service
displayname.c_str(), // service name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, // service type (interactive for debug)
SERVICE_AUTO_START, // start type
SERVICE_ERROR_NORMAL, // error control type
path.c_str(), // path to service's binary
nullptr, // no load ordering group
nullptr, // no tag identifier
dependencies, // dependencies
nullptr, // LocalSystem account
nullptr); // no password
并且在线此常量表明您有权暂停继续并停止服务,
然而,当我运行命令SERVICE_ALL_ACCESS
时,我得到以下输出
请求的暂停继续或停止对此服务无效
我的问题是我创建服务的方式有什么问题吗?
服务控制处理程序功能
net stop <service-name>
答案 0 :(得分:1)
您在dwDesiredAccess
CreateService()
参数中指定的访问权限对net stop
命令没有影响。访问权限仅适用于返回的SC_HANDLE
,并影响该句柄与后续API调用的交互方式。
您看到的错误很可能是由于您调用SetServiceStatus()
而不包括SERVICE_ACCEPT_STOP
字段中的SERVICE_STATUS::dwControlsAccepted
标记造成的。
<强> dwControlsAccepted 强>
服务接受并在其处理函数中处理的控制代码(请参阅Handler
和HandlerEx
)。用户界面进程可以通过在ControlService
或ControlServiceEx
函数中指定控制命令来控制服务。默认情况下,所有服务都接受 SERVICE_CONTROL_INTERROGATE 值。要接受 SERVICE_CONTROL_DEVICEEVENT 值,服务必须使用RegisterDeviceNotification
函数注册以接收设备事件。以下是控制代码。
...
<强> SERVICE_ACCEPT_STOP 强>
00000001可以停止服务。
此控制代码允许服务接收 SERVICE_CONTROL_STOP 通知。