From ea997b340eafeb00b3cf896d03d91ed903cb4b2c Mon Sep 17 00:00:00 2001 From: "Tony J. White =" Date: Wed, 20 Sep 2006 16:13:20 +0000 Subject: [PATCH] * (bug 2813) ioquake3 on win32 is no longer linked to SHFolder.dll. instead it is dynamically loaded at run-time. this means that win95/win98 systems can fail the homepath detection gracefully if they don't have the dll installed (this dll is only provided by Internet Explorer updates on those systems) --- Makefile | 2 +- code/win32/win_shared.c | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index c4f743b7..d556c195 100644 --- a/Makefile +++ b/Makefile @@ -468,7 +468,7 @@ ifeq ($(PLATFORM),mingw32) BINEXT=.exe - LDFLAGS= -mwindows -lshfolder -lwsock32 -lgdi32 -lwinmm -lole32 + LDFLAGS= -mwindows -lwsock32 -lgdi32 -lwinmm -lole32 CLIENT_LDFLAGS= ifeq ($(USE_CURL),1) diff --git a/code/win32/win_shared.c b/code/win32/win_shared.c index 5ba8694e..f28ff3a9 100644 --- a/code/win32/win_shared.c +++ b/code/win32/win_shared.c @@ -287,14 +287,32 @@ char *Sys_GetCurrentUser( void ) char *Sys_DefaultHomePath(void) { TCHAR szPath[MAX_PATH]; static char path[MAX_OSPATH]; + FARPROC qSHGetFolderPath; + HMODULE shfolder = LoadLibrary("shfolder.dll"); + + if(shfolder == NULL) { + Com_Printf("Unable to load SHFolder.dll\n"); + return NULL; + } - if( !SUCCEEDED( SHGetFolderPath( NULL, CSIDL_APPDATA, + qSHGetFolderPath = GetProcAddress(shfolder, "SHGetFolderPathA"); + if(qSHGetFolderPath == NULL) + { + Com_Printf("Unable to find SHGetFolderPath in SHFolder.dll\n"); + FreeLibrary(shfolder); + return NULL; + } + + if( !SUCCEEDED( qSHGetFolderPath( NULL, CSIDL_APPDATA, NULL, 0, szPath ) ) ) { + Com_Printf("Unable to detect CSIDL_APPDATA\n"); + FreeLibrary(shfolder); return NULL; } Q_strncpyz( path, szPath, sizeof(path) ); Q_strcat( path, sizeof(path), "\\Quake3" ); + FreeLibrary(shfolder); if( !CreateDirectory( path, NULL ) ) { if( GetLastError() != ERROR_ALREADY_EXISTS )