diff options
author | Alexander Gottwald <alexander.gottwald@s1999.tu-chemnitz.de> | 2005-01-31 10:32:19 +0000 |
---|---|---|
committer | Alexander Gottwald <alexander.gottwald@s1999.tu-chemnitz.de> | 2005-01-31 10:32:19 +0000 |
commit | 2982d173cad762b801869b7ceacc237afdad88d6 (patch) | |
tree | be9a82187a4960a2666c6bc8a61f0c12d3884001 /hw/xwin/InitOutput.c | |
parent | 8ac3be3f6c4bcaa8c3f6080cbfe72db4967feff8 (diff) |
resolve SHGetFolderPath dynamicly since it is not available on all Windows
systems.
Diffstat (limited to 'hw/xwin/InitOutput.c')
-rw-r--r-- | hw/xwin/InitOutput.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/hw/xwin/InitOutput.c b/hw/xwin/InitOutput.c index 107d53bcd..0dd43d724 100644 --- a/hw/xwin/InitOutput.c +++ b/hw/xwin/InitOutput.c @@ -43,6 +43,13 @@ from The Open Group. #endif #ifdef RELOCATE_PROJECTROOT #include <shlobj.h> +typedef HRESULT (*SHGETFOLDERPATHPROC)( + HWND hwndOwner, + int nFolder, + HANDLE hToken, + DWORD dwFlags, + LPTSTR pszPath +); #endif @@ -627,11 +634,34 @@ winFixupPaths (void) } if (getenv("HOME") == NULL) { + HMODULE shfolder; + SHGETFOLDERPATHPROC shgetfolderpath = NULL; char buffer[MAX_PATH + 5]; strncpy(buffer, "HOME=", 5); - if(SHGetFolderPath(NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE, NULL, 0, - buffer + 5) == 0) + + /* Try to load SHGetFolderPath from shfolder.dll and shell32.dll */ + + shfolder = LoadLibrary("shfolder.dll"); + /* fallback to shell32.dll */ + if (shfolder == NULL) + shfolder = LoadLibrary("shell32.dll"); + + /* resolve SHGetFolderPath */ + if (shfolder != NULL) + shgetfolderpath = (SHGETFOLDERPATHPROC)GetProcAddress(shfolder, "SHGetFolderPathA"); + + /* query appdata directory */ + if (shgetfolderpath && + shgetfolderpath(NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE, NULL, 0, + buffer + 5) == 0) + { putenv(buffer); + } else + { + winMsg (X_ERROR, "Can not determine HOME directory\n"); + } + if (shfolder != NULL) + FreeLibrary(shfolder); } if (!g_fLogFileChanged) { static char buffer[MAX_PATH]; |