当我尝试使用它从服务注册新服务时,在Windows 7 x64上挂起CreateService或StartService。 在服务控制管理器中,我尝试运行的服务的状态为“正在启动”。
尝试创建和运行服务的代码:
SC_HANDLE hSCManager = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(!hSCManager)
throw ::GetLastError();
SC_HANDLE hService = ::OpenService(hSCManager,
TEXT("ProcessManager"),
SERVICE_ALL_ACCESS);
if(!hService && ::GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST)
{
hService = ::CreateService(hSCManager, TEXT("ProcessManager"),
TEXT("ProcessManager"), SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, TEXT("C:\\processmanager.sys"),
NULL, NULL, NULL, NULL, NULL);
}
if(!hService ||
(!::StartService(hService, 0, NULL) && ::GetLastError() != ERROR_SERVICE_ALREADY_RUNNING))
{
::CloseServiceHandle(hSCManager);
if(hService)
::CloseServiceHandle(hService);
DWORD err = ::GetLastError();
throw err;
}
请帮助:)
答案 0 :(得分:2)
来自documentation for ServiceMain:
请勿尝试在ServiceMain功能中启动其他服务。
和
SCM在初始化期间锁定服务控制数据库,因此如果服务在初始化期间尝试调用StartService,则调用将被阻止。当服务向SCM报告它已成功启动时,它可以调用StartService。如果服务需要运行其他服务,则服务应设置所需的依赖项。
所以,有你的问题:你的程序是死锁的,因为它在服务控制数据库被锁定时调用了StartService
。 (实际上,它可能首先在CreateService
调用上死锁;文档没有明确提及它,但同样的限制也适用于那里。)
在安装服务的同时安装设备驱动程序,而不是尝试从服务中安装它。