我看着整個互聯網,似乎沒有一個像樣的解決方案,我可以找到。我希望能夠以編程方式在C++中獲取資源管理器可以轉化爲真實路徑的路徑「%ALLUSERSPROFILE%\ Application Data」。如何在Windows中使用C++獲取應用程序數據路徑?
我可以在不依賴第三方代碼的情況下做到這一點嗎?
我看着整個互聯網,似乎沒有一個像樣的解決方案,我可以找到。我希望能夠以編程方式在C++中獲取資源管理器可以轉化爲真實路徑的路徑「%ALLUSERSPROFILE%\ Application Data」。如何在Windows中使用C++獲取應用程序數據路徑?
我可以在不依賴第三方代碼的情況下做到這一點嗎?
使用SHGetFolderPath
與CSIDL_COMMON_APPDATA
作爲CSIDL。
TCHAR szPath[MAX_PATH];
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, szPath)))
{
//....
}
你也可以從註冊表中讀取值
路徑= HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\的Windows \ CurrentVersion \ Explorer中\ Shell文件夾
鍵= 常見AppData的
我想是否可以。 – 2010-05-24 18:50:03
無證並可能隨時更改;躲開它。有API,使用它。 – 2010-05-24 20:00:46
請注意,「有待更改」狀態在Win32世界中可能會發生變化。 – ActiveTrayPrntrTagDataStrDrvr 2012-11-13 09:10:19
只是爲了提供interjay的回答
我不得不包括shlobj.h
才能使用SHGetFolderPath
。
通常你可能需要從應用程序數據讀取文件, 要做到這一點,你需要使用pathAppend
功能(需要對這個shlwapi.h
)。
#include <shlwapi.h>
#pragma comment(lib,"shlwapi.lib")
#include "shlobj.h"
TCHAR szPath[MAX_PATH];
// Get path for each computer, non-user specific and non-roaming data.
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, szPath)))
{
// Append product-specific path
PathAppend(szPath, _T("\\My Company\\My Product\\1.0\\"));
}
詳情請參閱here。
+1和一個註釋:要使用_T(「...」),您必須#include
您應該使用'TEXT()'宏而不是'_T()'宏(或停止完全使用「TCHAR」 - 除非你確實需要支持Win9x/ME)。 Win32 API使用'TEXT()',C運行時庫使用'_T()'。 – 2014-08-25 22:49:13
不錯,CSIDL_COMMON_APPDATA是我正在尋找的CSIDL。 – 2010-05-24 17:54:55
還有更新的,並且不一定很炫的SHGetKnownFolderPath。可用於Vista或更高版本。 – OldFart 2010-05-24 20:36:11
我也想補充一點,那就是CSIDL_APPDATA這是用戶特定的版本。 (COMMON_APPDATA在所有用戶之間共享) – 2014-12-07 20:17:49