【发布时间】:2016-11-28 10:22:21
【问题描述】:
我正在使用 c++ 将程序编码为服务,当我将其作为普通程序进行测试时,函数 GetCurrentDirectory 返回正确的路径。但是当我尝试将我的程序安装为服务时,GetCurrentDirectory 返回C:\Windows\System32 而不是可执行文件的路径。
如何以适用于服务的方式获取可执行文件的路径?
【问题讨论】:
标签: c++ service windows-services
我正在使用 c++ 将程序编码为服务,当我将其作为普通程序进行测试时,函数 GetCurrentDirectory 返回正确的路径。但是当我尝试将我的程序安装为服务时,GetCurrentDirectory 返回C:\Windows\System32 而不是可执行文件的路径。
如何以适用于服务的方式获取可执行文件的路径?
【问题讨论】:
标签: c++ service windows-services
Windows 服务的工作目录始终为%WINDIR%\System32。
要获取可执行文件所在的目录,只需调用 GetModuleFileName 并将 hModule 参数设为 NULL,然后手动删除可执行文件名称。
【讨论】:
因为%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。GetModuleFileName()。它易于使用但要小心:它在 WOW64、一些虚拟化环境和svcshot 托管服务方面有一些棘手的行为(它有点旧,但您可能想阅读this article。)
QueryServiceConfig()。我的建议:
SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, szPath)。【讨论】: