summaryrefslogtreecommitdiff
path: root/win32.c
diff options
context:
space:
mode:
authorDarkvater <Darkvater@openttd.org>2006-12-09 23:55:56 +0000
committerDarkvater <Darkvater@openttd.org>2006-12-09 23:55:56 +0000
commit533034780b33af04a631518a077b228ff21c70a9 (patch)
treedb4b5a398448256d50bf2166c258937fe8f07aa7 /win32.c
parentba0051175f3bac43556da5f56365f04121fbba85 (diff)
downloadopenttd-533034780b33af04a631518a077b228ff21c70a9.tar.xz
(svn r7460) -Fix (r7337): [win32] If the underlying OS didn't have support for SHGetFolderPath the
application failed to run. Now test if the function exists and if not try a different approach using our own OTTDSHGetFolderPath wrapper.
Diffstat (limited to 'win32.c')
-rw-r--r--win32.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/win32.c b/win32.c
index 2f2c1fbdc..b81fb432a 100644
--- a/win32.c
+++ b/win32.c
@@ -14,6 +14,7 @@
#include <wininet.h>
#include <io.h>
#include <fcntl.h>
+#include <shlobj.h> // SHGetFolderPath
#include "variables.h"
#include "win32.h"
#include "fios.h" // opendir/readdir/closedir
@@ -1092,3 +1093,52 @@ const char *FS2OTTD(const wchar_t *name)
static char utf8_buf[512];
return convert_from_fs(name, utf8_buf, lengthof(utf8_buf));
}
+
+/** Our very own SHGetFolderPath function for support of windows operating
+ * systems that don't have this function (eg Win9x, etc.). We try using the
+ * native function, and if that doesn't exist we will try a more crude approach
+ * of environment variables and hope for the best */
+HRESULT OTTDSHGetFolderPath(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPTSTR pszPath)
+{
+ static HRESULT (WINAPI *SHGetFolderPath)(HWND, int, HANDLE, DWORD, LPTSTR) = NULL;
+ static bool first_time = true;
+
+ /* We only try to load the library one time; if it fails, it fails */
+ if (first_time) {
+#if defined(UNICODE)
+# define W(x) x "W"
+#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");
+ }
+#undef W
+ first_time = false;
+ }
+
+ if (SHGetFolderPath != NULL) return SHGetFolderPath(hwnd, csidl, hToken, dwFlags, pszPath);
+
+ /* SHGetFolderPath doesn't exist, try a more conservative approach,
+ * eg environment variables. This is only included for legacy modes
+ * MSDN says: that 'pszPath' is a "Pointer to a null-terminated string of
+ * length MAX_PATH which will receive the path" so let's assume that
+ * Windows 95 with Internet Explorer 5.0, Windows 98 with Internet Explorer 5.0,
+ * Windows 98 Second Edition (SE), Windows NT 4.0 with Internet Explorer 5.0,
+ * Windows NT 4.0 with Service Pack 4 (SP4) */
+ {
+ DWORD ret;
+ switch (csidl) {
+ case CSIDL_FONTS: /* Get the system font path, eg %WINDIR%\Fonts */
+ ret = GetEnvironmentVariable(_T("WINDIR"), pszPath, MAX_PATH * sizeof(TCHAR));
+ if (ret == 0) break;
+ _tcsncat(pszPath, _T("\\Fonts"), MAX_PATH * sizeof(TCHAR));
+
+ return (HRESULT)0;
+ break;
+ /* XXX - other types to go here when needed... */
+ }
+ }
+
+ return E_INVALIDARG;
+}