Use SHGetKnownFolderPath instead of SHGetFolderPathW.

When getting system directories for Windows, we currently use
SHGetFolderPathW. This is a deprecated function and doesn't support
"Downloads" folders.

As a replacement, this commit uses the newer SHGetKnownFolderPath
function, which is supported since Windows Vista. Godot 3.0 only
supports Windows 7+, so we don't need to use SHGetFolderPathW for
backwards compatibility.

Fixes #26876

(cherry picked from commit 3d908f57d8)
This commit is contained in:
KLee1248 2019-04-18 02:43:33 +00:00 committed by Rémi Verschelde
parent 3cb47c9b66
commit 2e5fa9f043
1 changed files with 14 additions and 12 deletions

View File

@ -2867,39 +2867,41 @@ String OS_Windows::get_godot_dir_name() const {
String OS_Windows::get_system_dir(SystemDir p_dir) const { String OS_Windows::get_system_dir(SystemDir p_dir) const {
int id; KNOWNFOLDERID id;
switch (p_dir) { switch (p_dir) {
case SYSTEM_DIR_DESKTOP: { case SYSTEM_DIR_DESKTOP: {
id = CSIDL_DESKTOPDIRECTORY; id = FOLDERID_Desktop;
} break; } break;
case SYSTEM_DIR_DCIM: { case SYSTEM_DIR_DCIM: {
id = CSIDL_MYPICTURES; id = FOLDERID_Pictures;
} break; } break;
case SYSTEM_DIR_DOCUMENTS: { case SYSTEM_DIR_DOCUMENTS: {
id = CSIDL_PERSONAL; id = FOLDERID_Documents;
} break; } break;
case SYSTEM_DIR_DOWNLOADS: { case SYSTEM_DIR_DOWNLOADS: {
id = 0x000C; id = FOLDERID_Downloads;
} break; } break;
case SYSTEM_DIR_MOVIES: { case SYSTEM_DIR_MOVIES: {
id = CSIDL_MYVIDEO; id = FOLDERID_Videos;
} break; } break;
case SYSTEM_DIR_MUSIC: { case SYSTEM_DIR_MUSIC: {
id = CSIDL_MYMUSIC; id = FOLDERID_Music;
} break; } break;
case SYSTEM_DIR_PICTURES: { case SYSTEM_DIR_PICTURES: {
id = CSIDL_MYPICTURES; id = FOLDERID_Pictures;
} break; } break;
case SYSTEM_DIR_RINGTONES: { case SYSTEM_DIR_RINGTONES: {
id = CSIDL_MYMUSIC; id = FOLDERID_Music;
} break; } break;
} }
WCHAR szPath[MAX_PATH]; PWSTR szPath;
HRESULT res = SHGetFolderPathW(NULL, id, NULL, 0, szPath); HRESULT res = SHGetKnownFolderPath(id, 0, NULL, &szPath);
ERR_FAIL_COND_V(res != S_OK, String()); ERR_FAIL_COND_V(res != S_OK, String());
return String(szPath); String path = String(szPath);
CoTaskMemFree(szPath);
return path;
} }
String OS_Windows::get_user_data_dir() const { String OS_Windows::get_user_data_dir() const {