【问题标题】:Why wont my windows service write to a file continuously?为什么我的 Windows 服务不会连续写入文件?
【发布时间】:2012-01-24 02:30:22
【问题描述】:

我创建了一个 Windows 服务,用于检查已安装的打印机并更新当前位于“C:\App\Data\info”的文件(无文件扩展名) 非常简单,它所做的只是使用正确的标志和转储调用 EnumPrinters PRINTER_INFO_2 到一个文件。

在 Visual Studio 2010 中,“测试”项目中的一切都完全符合预期,这让我相信问题不在我的服务范围内。一旦我将它安装为 Windows 服务,它就会停止循环。它将通过循环一次并且永远不会再次运行。

代码参考:
我正在使用这里的模板:http://www.kencotutorials.com/WindowsService.aspx 并且只更改了服务类文件。

最初的想法是安全权限或等待功能未返回。

编辑:我已经检查了整个文件系统,看看它是否被写入其他地方并确认它不是。

这是模板调用的服务循环函数。

void CMyService::MyServiceLoop(void)
{
    CheckPrinters(); // updates a PRINTER_INFO_2 struct with all installed printers
    WritePrinterFile(); // writes the file (i know there's no issue with the actual writing)

    Sleep(10000);
    OutputDebugString("Done sleeping");
    Return;
}

我在 shell 应用循环的开头添加了 OutputDebugString("Shell loop entered")。 我还在调用 WaitForSingleObject() 之前添加了 OutputDebugString("Waiting for object")

循环似乎挂在 WaitForSingleObject 上。 DbgView 中的最后一条消息是“等待对象”。

【问题讨论】:

  • Sleep(10000) 在里面做什么?
  • 最初,当服务没有安装时,我需要放慢它的速度。我把它留在里面是因为我希望它大约每十秒发射一次。这会导致问题吗?

标签: c++ visual-studio-2010 windows-services


【解决方案1】:

可能有很多原因。我建议您添加一些 OutputDebugString() 调用(Win32 API 函数)并从 Microsoft 获取 DbgView.exe 以查看发生了什么。此外,听起来您并没有这样做,但请确保您没有写入映射的驱动器或网络位置,因为您的服务很可能无法访问这些。

【讨论】:

  • 刚刚试用了 Dbgview.exe 并没有设法找到它,它似乎只运行了一次循环。 WaitForSingleObject() 会导致这个问题吗?
【解决方案2】:

当您设置 Windows 服务时,您是否在“登录”选项卡上指定了一个帐户? http://www.coretechnologies.com/WindowsServices/FAQ.html#AppNotWorkingFromService

默认的本地系统帐户几乎肯定没有使用打印机的权限,因此请务必设置一个可以正常访问打印机的帐户。

【讨论】:

  • 我没有,但是它会运行一次循环。它完美地访问打印机,将所有信息转储到文件中,并且通常完全按预期工作。它只是不循环。已测试从我的管理员帐户登录,它仍然只运行一次循环。
  • 您能否在上面描述的 WaitForSingleObject 调用周围发布代码?
  • 我正要这样做,但我注意到循环顶部缺少 Do,问题解决了!我觉得自己像个白痴……
  • 魔鬼通常在细节中......你可能想关闭这个问题,因为它可能不会让其他人受益......
猜你喜欢
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多