問題描述
GetCurrentDirectory 並沒有真正返回可執行文件的路徑 (GetCurrentDirectory does not really return the path of the executable file)
我正在使用 c++ 將程序編碼為服務,當我將其作為普通程序進行測試時,函數 GetCurrentDirectory
返回正確的路徑。但是當我嘗試將我的程序安裝為服務時,GetCurrentDirectory
返回 C:\Windows\System32
而不是可執行文件的路徑。
如何我以適用於服務的方式獲取可執行文件的路徑?
參考解法
方法 1:
Working directory for Windows services is always %WINDIR%\System32
.
To get directory, where your executable resides, simply call GetModuleFileName with NULL for hModule
argument, and manually strip executable name.
方法 2:
Because %WinDir%\System32
is the default working directory for a 32/64 bit Windows service (%WinDir%\SysWOW64
for 32 bit services on 64 bit Windows).
You may set working directory of your service to something else, see also Windows Service: Can I configure the current working directory? or ‑ better ‑ do not rely in your code about working directory. Few options:
- Read it from registry:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\<service name>\ImagePath
. - Use WMI to enumerate services (if you really want to...)
- Use
GetModuleFileName()
. It's easy to use but be careful: it has some tricky behavior with WOW64, some virtualization environments and forsvcshot
hosted services (it's little bit old but you may want to read this article.) - Use
QueryServiceConfig()
.
What I'd suggest:
- Save/load your data in a shared known folder, for example for Common Application Data:
SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, szPath)
.
(by duongtan、Starl1ght、Adriano Repetti)