【问题标题】:GetCurrentDirectory does not really return the path of the executable fileGetCurrentDirectory 并没有真正返回可执行文件的路径
【发布时间】:2016-11-28 10:22:21
【问题描述】:

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

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

【问题讨论】:

    标签: c++ service windows-services


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,它有效
    【解决方案2】:

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

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

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

    我的建议:

    • 将数据保存/加载到共享的已知文件夹中,例如 Common Application Data:SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, szPath)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      相关资源
      最近更新 更多