如何调试Windows服务

Sim*_*ons 2 c++ windows windows-services window servicecontroller

我使用Code Project Article 创建了一个Windows服务.我可以使用-i和-d开关安装服务并删除服务.

我能够在services.msc中看到该服务,但是当我启动该服务时它什么也没做.我将提供服务主代码:

void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{
  DWORD status;
  DWORD specificError;
  m_ServiceStatus.dwServiceType = SERVICE_WIN32;
  m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
  m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
  m_ServiceStatus.dwWin32ExitCode = 0;
  m_ServiceStatus.dwServiceSpecificExitCode = 0;
  m_ServiceStatus.dwCheckPoint = 0;
  m_ServiceStatus.dwWaitHint = 0;

  m_ServiceStatusHandle = RegisterServiceCtrlHandler("Service1", 
                                            ServiceCtrlHandler); 
  if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
  {
    return;
  }
  m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
  m_ServiceStatus.dwCheckPoint = 0;
  m_ServiceStatus.dwWaitHint = 0;
  if (!SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus))
  {
  }

  bRunning=true;
  while(bRunning)
  {

    Sleep(150000);
    ShellExecute(NULL, "open", "C:\\", NULL, NULL, SW_SHOWNORMAL);

  }
  return;
}
Run Code Online (Sandbox Code Playgroud)

但是当我启动服务时,它既不会睡觉也不会启动资源管理器.我错过了什么吗?

Ian*_*dby 5

Ferruccio建议将调试器附加到正在运行的服务上是一个很好的建议,因为建议包含一个作为控制台应用程序运行的选项(尽管这对你的情况没有帮助).

要调试启动代码,可以在启动代码的开头调用DebugBreak().这将启动调试器并暂停您的服务执行.进入调试器后,设置所需的断点,然后继续执行.


OJ.*_*OJ. -1

服务是无头的,因此尝试启动任何与 GUI 相关的内容将不会产生可见的效果。ShellExecute 将在服务的可视上下文中启动应用程序,您的桌面将无法看到该应用程序。

如果您想证明您的服务正在执行某些操作,请向文件系统写入一些内容(或者相信它正在运行,因为服务管理器有足够的能力告诉您它是否没有运行)。