diff --git a/src/os/windows/win32.cpp b/src/os/windows/win32.cpp index 62f7894d55..3bb22288f5 100644 --- a/src/os/windows/win32.cpp +++ b/src/os/windows/win32.cpp @@ -17,6 +17,7 @@ #include "../../fios.h" #include #include +#include #include /* SHGetFolderPath */ #include #include "win32.h" @@ -732,8 +733,11 @@ HRESULT OTTDSHGetFolderPath(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, #else # define W(x) x "A" #endif - if (!LoadLibraryList((Function*)&SHGetFolderPath, "SHFolder.dll\0" W("SHGetFolderPath") "\0\0")) { - DEBUG(misc, 0, "Unable to load " W("SHGetFolderPath") "from SHFolder.dll"); + /* The function lives in shell32.dll for all current Windows versions, but it first started to appear in SHFolder.dll. */ + if (!LoadLibraryList((Function*)&SHGetFolderPath, "shell32.dll\0" W("SHGetFolderPath") "\0\0")) { + if (!LoadLibraryList((Function*)&SHGetFolderPath, "SHFolder.dll\0" W("SHGetFolderPath") "\0\0")) { + DEBUG(misc, 0, "Unable to load " W("SHGetFolderPath") "from either shell32.dll or SHFolder.dll"); + } } #undef W first_time = false; @@ -758,6 +762,17 @@ HRESULT OTTDSHGetFolderPath(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, return (HRESULT)0; + case CSIDL_PERSONAL: + case CSIDL_COMMON_DOCUMENTS: { + HKEY key; + if (RegOpenKeyEx(csidl == CSIDL_PERSONAL ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE, REGSTR_PATH_SPECIAL_FOLDERS, 0, KEY_READ, &key) != ERROR_SUCCESS) break; + DWORD len = MAX_PATH; + ret = RegQueryValueEx(key, csidl == CSIDL_PERSONAL ? _T("Personal") : _T("Common Documents"), NULL, NULL, (LPBYTE)pszPath, &len); + RegCloseKey(key); + if (ret == ERROR_SUCCESS) return (HRESULT)0; + break; + } + /* XXX - other types to go here when needed... */ } }