From 5f5eea806761cd92708e9e31af7cf53919227dae Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Sun, 1 May 2011 21:06:13 +0200 Subject: [PATCH] also support SavedGames on Win32 --- radiant/mainframe.cpp | 47 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/radiant/mainframe.cpp b/radiant/mainframe.cpp index 4b580bc..9dc8faf 100644 --- a/radiant/mainframe.cpp +++ b/radiant/mainframe.cpp @@ -186,6 +186,11 @@ void VFS_Destroy() #ifdef WIN32 #include +const GUID qFOLDERID_SavedGames = {0x4C5C32FF, 0xBB9D, 0x43b0, {0xB5, 0xB4, 0x2D, 0x72, 0xE5, 0x4E, 0xAA, 0xA4}}; +#define qREFKNOWNFOLDERID GUID +#define qKF_FLAG_CREATE 0x8000 +#define qKF_FLAG_NO_ALIAS 0x1000 +static HRESULT (WINAPI *qSHGetKnownFolderPath) (qREFKNOWNFOLDERID rfid, DWORD dwFlags, HANDLE hToken, PWSTR *ppszPath); #endif void HomePaths_Realise() { @@ -220,19 +225,43 @@ void HomePaths_Realise() { StringOutputStream path(256); TCHAR mydocsdir[MAX_PATH + 1]; - if(SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, 0, mydocsdir)) - { - path << DirectoryCleaned(mydocsdir) << "My Games/" << (prefix+1) << "/"; - // win32: only add it if it already exists - if(file_is_directory(path.c_str())) - g_qeglobals.m_userEnginePath = path.c_str(); - else - g_qeglobals.m_userEnginePath = EnginePath_get(); - } + wchar_t *mydocsdirw; + HMODULE shfolder = LoadLibrary("shfolder.dll"); + if(shfolder) + qSHGetKnownFolderPath = GetProcAddress("SHGetFolderPathA"); else + qSHGetKnownFolderPath = NULL; + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + do { + if(qSHGetKnownFolderPath && qSHGetKnownFolderPath(qFOLDERID_SavedGames, qKF_FLAG_CREATE | qKF_FLAG_NO_ALIAS, NULL, &mydocsdirw) == S_OK) + { + memset(mydocsdir, 0, sizeof(mydocsdir)); + wctombs(mydocsdir, mydocsdirw, sizeof(mydocsdir)-1); + CoTaskMemFree(mydocsdirw); + path << DirectoryCleaned(mydocsdir) << (prefix+1) << "/"; + if(file_is_directory(path.c_str())) + { + g_qeglobals.m_userEnginePath = path.c_str(); + break; + } + } + if(SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, 0, mydocsdir)) + { + path << DirectoryCleaned(mydocsdir) << "My Games/" << (prefix+1) << "/"; + // win32: only add it if it already exists + if(file_is_directory(path.c_str())) + { + g_qeglobals.m_userEnginePath = path.c_str(); + break; + } + } g_qeglobals.m_userEnginePath = EnginePath_get(); } + while(0); + CoUninitialize(); + if(shfolder) + FreeLibrary(shfolder); } else #endif -- 2.39.2