Changeset - r20177:c065d1a418bd
[Not reviewed]
master
0 1 0
michi_cc - 11 years ago 2013-04-06 18:36:49
michi_cc@openttd.org
(svn r25155) -Codechange: [Win32] Improve SHGetFolderPath emulation.
1 file changed with 17 insertions and 2 deletions:
0 comments (0 inline, 0 general)
src/os/windows/win32.cpp
Show inline comments
 
@@ -17,6 +17,7 @@
 
#include "../../fios.h"
 
#include <windows.h>
 
#include <fcntl.h>
 
#include <regstr.h>
 
#include <shlobj.h> /* SHGetFolderPath */
 
#include <Shellapi.h>
 
#include "win32.h"
 
@@ -732,8 +733,11 @@ HRESULT OTTDSHGetFolderPath(HWND hwnd, i
 
#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, i
 

	
 
				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... */
 
		}
 
	}
0 comments (0 inline, 0 general)