使用文件I/O正确创建和运行win32服务

Rik*_*der 3 c c++ service winapi

我已经基于这个代码示例编写了一个非常简单的服务应用程序.

作为正常运行的一部分,应用程序假定在找到的目录中或在其执行路径中存在文件.

当我'安装'服务然后从控制面板中的服务管理器"启动"服务时.应用程序失败,因为它找不到要打开和读取的文件(即使该文件与安装的可执行文件位于同一目录中).

我的问题是什么时候运行Windows服务,这应该是预期的运行路径?

当调用'CreateService'时,似乎只有二进制的路径参数,而不是执行.有没有办法指出应该从哪里执行二进制文件?

我在Windows Vista和Windows 7上试过这个.得到同样的问题.

bta*_*bta 6

由于Windows服务是从与普通用户模式应用程序不同的上下文运行的,因此最好不要对工作目录或相对路径做任何假设.除了工作目录的差异之外,服务可以使用完全不同的权限集等运行.

使用服务所需文件的绝对路径应完全避免此问题.无论工作目录如何,绝对路径都将被解释为相同,因此这应该使您的服务的工作目录无关紧要.有几种方法可以解决这个问题:

  1. 硬编码绝对路径 - 这可能是避免问题的最简单方法,但它也是最不灵活的.这种方法对于基本的开发和测试工作来说可能很好,但是在其他人开始使用你的程序之前你可能想要一些更复杂的东西.
  2. 将绝对路径存储在环境变量中 - 这为您提供了额外的灵活性,因为现在可以将路径设置为任意值并根据需要进行更改.由于服务可以作为具有不同环境变量集的不同用户运行,因此仍然存在一些使用此方法的问题.
  3. 在注册表中存储绝对路径 - 这可能是最简单的方法.从注册表中检索路径将为所有用户帐户提供相同的结果,而且在安装时相对容易设置.