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

标签 c++ c winapi service

我基于此 code example 编写了一个非常简单的服务应用程序.

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

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

我的问题是当一个 windows 服务运行时,预期的运行路径应该是什么?

调用“CreateService”时,似乎只有二进制文件的路径参数,而不是执行文件的路径参数。有什么方法可以指示应该从哪里执行二进制文件?

我在 windows vista 和 windows 7 上试过这个。遇到同样的问题。

最佳答案

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

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

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

关于c++ - 使用文件 I/O 正确创建和运行 win32 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12253921/

相关文章:

winapi - msvcrtd.dll 在哪里?

c++ - Linux 的 VirtualQueryEx 替代方案 - 如何获取另一个进程的虚拟内存范围

c++ - 为什么当我在 const 之前写 noexcept 时出现错误

c++ - 如何将迭代器变量声明为私有(private)成员变量?

c - 如何将字符串复制到 C 中的数组?

c - 什么是 "null pointer assignment error"?

winapi - 如何巧妙地通知用户他的输入已收到

c++ - Knuth 置换算法奇怪的行为

c++ - 计算数字数组的排列顺序(递归)

c - 如何为 C11 U“unicode 文字”正确使用 `__attribute__((format (printf, x, y)))`?