- // cache the version info, it's not going to change
- //
- // NB: this is MT-safe, we may use these static vars from different threads
- // but as they always have the same value it doesn't matter
- static int s_ver = -1,
- s_major = -1,
- s_minor = -1;
-
- if ( s_ver == -1 )
+#if defined(_WIN64)
+ return true; // 64-bit programs run only on Win64
+#elif wxUSE_DYNLIB_CLASS // Win32
+ // 32-bit programs run on both 32-bit and 64-bit Windows so check
+ typedef BOOL (WINAPI *IsWow64Process_t)(HANDLE, BOOL *);
+
+ wxDynamicLibrary dllKernel32(_T("kernel32.dll"));
+ IsWow64Process_t pfnIsWow64Process =
+ (IsWow64Process_t)dllKernel32.RawGetSymbol(_T("IsWow64Process"));
+
+ BOOL wow64 = FALSE;
+ if ( pfnIsWow64Process )
+ {
+ pfnIsWow64Process(::GetCurrentProcess(), &wow64);
+ }
+ //else: running under a system without Win64 support
+
+ return wow64 != FALSE;
+#else
+ return false;
+#endif // Win64/Win32
+}
+
+wxOperatingSystemId wxGetOsVersion(int *verMaj, int *verMin)
+{
+ static struct
+ {
+ // this may be false, true or -1 if we tried to initialize but failed
+ int initialized;
+
+ wxOperatingSystemId os;
+
+ int verMaj,
+ verMin;
+ } s_version;
+
+ // query the OS info only once as it's not supposed to change
+ if ( !s_version.initialized )