GetCurrentDirectory并不真正返回可执行文件的路径

时间:2016-11-28 10:22:21

标签: c++ service windows-services

我使用c ++将程序编码为服务,当我将其作为普通程序进行测试时,函数GetCurrentDirectory返回正确的路径。但是当我尝试将我的程序安装为服务时,GetCurrentDirectory会返回C:\Windows\System32而不是可执行文件的路径。

如何以适用于服务的方式获取可执行文件的路径?

2 个答案:

答案 0 :(得分:1)

Windows服务的工作目录始终为%WINDIR%\System32

要获取可执行文件所在的目录,只需为hModule参数调用NULL GetModuleFileName,然后手动删除可执行文件名。

答案 1 :(得分:1)

因为%WinDir%\System32是32/64位Windows服务的默认工作目录(64位Windows上32位服务的%WinDir%\SysWOW64)。

您可以将服务的工作目录设置为其他内容,另请参阅Windows Service: Can I configure the current working directory?或 - 更好 - 不要依赖有关工作目录的代码。几个选项:

  • 从注册表中读取它:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\<service name>\ImagePath
  • 使用WMI枚举服务(如果您真的想...)
  • 使用GetModuleFileName()。它易于使用但要小心:它在WOW64,某些虚拟化环境和svcshot托管服务方面有一些棘手的行为(它的有点旧但你可能想要阅读{{3} }。)
  • 使用QueryServiceConfig()

我建议:

  • 将您的数据保存/加载到共享的已知文件夹中,例如,对于公共应用程序数据:SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, szPath)