【问题标题】:Issue with windows service (C++,WinAPI)Windows 服务问题(C++、WinAPI)
【发布时间】:2011-12-25 21:06:39
【问题描述】:

我在使用 Windows 服务时遇到问题,我的应用程序正在注册 Windows 服务,但是当我尝试运行该服务时,我收到以下错误:“错误 1053:服务未响应启动或控制请求一种及时的时尚”。以下代码负责注册服务(我从 MSDN 得到)。

SC_HANDLE schSCManager;
SC_HANDLE schService;

path modulePath("some path to executable");

std::string moduleName = narrow(modulePath.native());

if(!GetModuleFileNameA(NULL, &moduleName[0], MAX_PATH))
{
 throw std::runtime_error("Cannot register service, error code: " +    boost::lexical_cast<std::string>(GetLastError()));
}

// Get a handle to the SCM database. 
   schSCManager = OpenSCManager(NULL,                   // local computer
                                NULL,                   // ServicesActive database 
                                SC_MANAGER_ALL_ACCESS); // full access rights 

   if(!schSCManager) 
   {
      throw std::runtime_error("OpenSCManager failed: " + boost::lexical_cast<std::string>(GetLastError()));
   }

   // Create the service
   schService = CreateServiceA( 
        schSCManager,              // SCM database 
        "name",                  // name of service 
        "displayname",                  // service name to display 
        SERVICE_ALL_ACCESS,        // desired access 
        SERVICE_WIN32_OWN_PROCESS, // service type 
        SERVICE_AUTO_START,        // start type 
        SERVICE_ERROR_NORMAL,      // error control type 
        narrow(modulePath.native()).c_str(), // path to service's binary 
        NULL,                      // no load ordering group 
        NULL,                      // no tag identifier 
        NULL,                      // no dependencies 
        NULL,                      // LocalSystem account 
        NULL);                     // no password 

   if(!schService) 
   {
      CloseServiceHandle(schSCManager);

      throw std::runtime_error("CreateService failed: " + boost::lexical_cast<std::string>(GetLastError()));
   }
   else
   {
      //std::cout << "\nService installed successfully\n";
   } 

   CloseServiceHandle(schService); 
   CloseServiceHandle(schSCManager);   

你能帮忙解决这个问题吗?

【问题讨论】:

  • 您需要对服务进行一些调试。我们无法从服务注册码中算出来!
  • 我完成了所有可能的调试过程,服务只是没有启动。并谈到已经提到的错误。
  • 服务执行到多远?告诉我们你到目前为止所做的调试。您是否尝试过从服务中剥离所有代码以使其不执行任何操作?
  • 注册码应该没问题,start-event处理怎么样?
  • 我们需要更多关于您的服务主体、服务代码和服务控制处理程序方法的信息...到目前为止,安装代码看起来还不错...

标签: c++ windows winapi service


【解决方案1】:

如果给定的代码是您尝试过的唯一方法,那么您会遗漏 Windows 服务的一些重要要求。请看documentation

您至少需要一个 service main 函数(这与 main 方法不同!)和一个 control handler 函数,因为您无法处理“开始”命令,如果没有注册控制处理函数(这在服务主中完成)

为了正常工作,您需要:

  1. 普通 main 方法,确定是否要安装服务或以其他方式使用服务SERVICE_TABLE_ENTRY 启动服务控制调度程序
    该表主要包含进程名称和指向它的服务主函数的函数指针
  2. 你需要服务主函数来注册函数服务控制处理函数,然后启动服务代码函数
  3. 服务代码函数包含与服务作业相关的代码,它是服务的核心
  4. 您需要服务控制处理程序函数。每当向服务发送控制代码时,它都会从 Windows 的服务控制管理器中调用...这是接收“停止”命令的方法...如果此功能不存在或未正确注册您最终可能会遇到上述错误...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多