static LANGID _GetUserDefaultUILanguage(void){ LANGID wUILang = 0; OSVERSIONINFO Osv ; Osv.dwOSVersionInfoSize = sizeof(Osv) ; if(GetVersionEx(&Osv) && Osv.dwMajorVersion >= 5.0){ //Windows 200 and later HMODULE hMKernel32 = LoadLibraryW(L"kernel32.dll") ; if (hMKernel32){ LANGID (WINAPI *pfnGetUserDefaultUILanguage) () = (LANGID (WINAPI *)(void))GetProcAddress(hMKernel32, "GetUserDefaultUILanguage"); if(NULL != pfnGetUserDefaultUILanguage){ wUILang = pfnGetUserDefaultUILanguage() ; } FreeLibrary(hMKernel32); } } return (wUILang ? wUILang : GetUserDefaultLangID()); }
////////////////////////////////////////////////////////////////////////// //Purpose: GetUserDefaultUILanguage for downlevel platforms (Win9x, NT4). //Input: szDllName - the string resource dll name to search. Ex: ToolUI.dll //Output: TCHAR *szPathOut - filled with absolute path to dll, if found. // size_t sizeInCharacters - buffer size in characters //Returns: Success - HMODULE of found dll, Failure - NULL ////////////////////////////////////////////////////////////////////////// HRESULT GetUserDefaultUILanguageLegacyCompat(LANGID* pLangid) { HRESULT hr=E_FAIL; if (pLangid == NULL) { return E_POINTER; } PFNGETUSERDEFAULTUILANGUAGE pfnGetUserDefaultUILanguage; HINSTANCE hKernel32 = ::GetModuleHandle(_T("kernel32.dll")); pfnGetUserDefaultUILanguage = (PFNGETUSERDEFAULTUILANGUAGE)::GetProcAddress(hKernel32, "GetUserDefaultUILanguage"); if(pfnGetUserDefaultUILanguage != NULL) { *pLangid = pfnGetUserDefaultUILanguage(); hr = S_OK; } else { // We're not on an MUI-capable system. OSVERSIONINFO version; memset(&version, 0, sizeof(version)); version.dwOSVersionInfoSize = sizeof(version); ::GetVersionEx(&version); if( version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { // We're on Windows 9x, so look in the registry for the UI language HKEY hKey = NULL; LONG nResult = ::RegOpenKeyEx(HKEY_CURRENT_USER, _T( "Control Panel\\Desktop\\ResourceLocale" ), 0, KEY_READ, &hKey); if (nResult == ERROR_SUCCESS) { DWORD dwType; TCHAR szValue[16]; ULONG nBytes = sizeof( szValue ); nResult = ::RegQueryValueEx(hKey, NULL, NULL, &dwType, LPBYTE( szValue ), &nBytes ); if ((nResult == ERROR_SUCCESS) && (dwType == REG_SZ)) { DWORD dwLangID; int nFields = _stscanf_s( szValue, _T( "%x" ), &dwLangID ); if( nFields == 1 ) { *pLangid = LANGID( dwLangID ); hr = S_OK; } } ::RegCloseKey(hKey); } } else { // We're on NT 4. The UI language is the same as the language of the version // resource in ntdll.dll HMODULE hNTDLL = ::GetModuleHandle( _T( "ntdll.dll" ) ); if (hNTDLL != NULL) { *pLangid = 0; ::EnumResourceLanguages( hNTDLL, RT_VERSION, MAKEINTRESOURCE( 1 ), _EnumResLangProc, reinterpret_cast< LONG_PTR >( pLangid ) ); if (*pLangid != 0) { hr = S_OK; } } } } return hr; }
FORCE_INLINE int NSISCALL ui_doinstall(void) { header *header = g_header; static WNDCLASS wc; // richedit subclassing and bgbg creation // detect default language // more information at: // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/nls_0xrn.asp LANGID (WINAPI *GUDUIL)(); GUDUIL = myGetProcAddress(MGA_GetUserDefaultUILanguage); if (GUDUIL) { // Windows ME/2000+ myitoa(state_language, GUDUIL()); } else { static const TCHAR reg_9x_locale[] = _T("Control Panel\\Desktop\\ResourceLocale"); static const TCHAR reg_nt_locale_key[] = _T(".DEFAULT\\Control Panel\\International"); const TCHAR *reg_nt_locale_val = ®_9x_locale[30]; // = _T("Locale") with opt state_language[0] = _T('0'); state_language[1] = _T('x'); state_language[2] = 0; { // Windows 9x myRegGetStr(HKEY_CURRENT_USER, reg_9x_locale, NULL, g_tmp, 0); } if (!g_tmp[0]) { // Windows NT // This key exists on 9x as well, so it's only read if ResourceLocale wasn't found myRegGetStr(HKEY_USERS, reg_nt_locale_key, reg_nt_locale_val, g_tmp, 0); } mystrcat(state_language, g_tmp); } // set default language set_language(); // initialize auto close flag g_exec_flags.autoclose=g_flags&CH_FLAGS_AUTO_CLOSE; #ifdef NSIS_CONFIG_PLUGIN_SUPPORT // initialize plugin api g_exec_flags.plugin_api_version=NSISPIAPIVER_CURR; #endif // read install directory from registry if (!is_valid_instpath(state_install_directory)) { if (header->install_reg_key_ptr) { myRegGetStr( (HKEY)header->install_reg_rootkey, GetNSISStringNP(header->install_reg_key_ptr), GetNSISStringNP(header->install_reg_value_ptr), ps_tmpbuf, 0 ); if (ps_tmpbuf[0]) { TCHAR *p=ps_tmpbuf; TCHAR *e; if (p[0]==_T('\"')) { TCHAR *p2; p++; p2 = findchar(p, _T('"')); *p2 = 0; } // p is the path now, check for .exe extension e=p+mystrlen(p)-4; if (e > p) { // if filename ends in .exe, and is not a directory, remove the filename if (!lstrcmpi(e, _T(".exe"))) // check extension { DWORD d; d=GetFileAttributes(p); if (d == INVALID_FILE_ATTRIBUTES || !(d&FILE_ATTRIBUTE_DIRECTORY)) { // if there is no back-slash, the string will become empty, but that's ok because // it would make an invalid instdir anyway trimslashtoend(p); } } } mystrcpy(state_install_directory,addtrailingslash(p)); } } } if (!is_valid_instpath(state_install_directory)) { GetNSISString(state_install_directory,header->install_directory_ptr); } #ifdef NSIS_CONFIG_LOG if (g_flags & CH_FLAGS_SILENT_LOG && !g_is_uninstaller) { #if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT) build_g_logfile(); #endif log_dolog=1; } #endif #ifdef NSIS_CONFIG_VISIBLE_SUPPORT g_hIcon=LoadImage(g_hInstance,MAKEINTRESOURCE(IDI_ICON2),IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_SHARED); #ifdef NSIS_SUPPORT_BGBG if (header->bg_color1 != -1) { LPCTSTR cn = _T("_Nb"); RECT vp; extern LRESULT CALLBACK BG_WndProc(HWND, UINT, WPARAM, LPARAM); wc.lpfnWndProc = BG_WndProc; wc.hInstance = g_hInstance; wc.hIcon = g_hIcon; //wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.lpszClassName = cn; if (!RegisterClass(&wc)) return 0; SystemParametersInfo(SPI_GETWORKAREA, 0, &vp, 0); m_bgwnd = CreateWindowEx(WS_EX_TOOLWINDOW,cn,0,WS_POPUP, vp.left,vp.top,vp.right-vp.left,vp.bottom-vp.top,0,NULL,g_hInstance,NULL); } #endif//NSIS_SUPPORT_BGBG #endif//NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_SUPPORT_CODECALLBACKS // Select language if (ExecuteCallbackFunction(CB_ONINIT)) return 2; set_language(); #endif #ifdef NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_CONFIG_SILENT_SUPPORT if (!g_exec_flags.silent) #endif//NSIS_CONFIG_SILENT_SUPPORT { #ifdef NSIS_SUPPORT_BGBG ShowWindow(m_bgwnd, SW_SHOW); #endif//NSIS_SUPPORT_BGBG #ifdef NSIS_CONFIG_LICENSEPAGE { // load richedit DLL static const TCHAR riched20[]=_T("RichEd20"); static const TCHAR riched32[]=_T("RichEd32"); #ifdef UNICODE static const TCHAR richedit20t[]=_T("RichEdit20W"); #else static const TCHAR richedit20t[]=_T("RichEdit20A"); #endif static const TCHAR richedit[]=_T("RichEdit"); if (!LoadLibrary(riched20)) { LoadLibrary(riched32); // Win95 only ships with v1.0, NT4 has v2.0: web.archive.org/web/20030607222419/http://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/richedit/richeditcontrols/aboutricheditcontrols.asp } // make richedit20a/w point to RICHEDIT if (!GetClassInfo(NULL,richedit20t,&wc)) { GetClassInfo(NULL,richedit,&wc); wc.lpszClassName = richedit20t; RegisterClass(&wc); } } #endif { int ret=DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_INST+dlg_offset),0,DialogProc); #if defined(NSIS_SUPPORT_CODECALLBACKS) && defined(NSIS_CONFIG_ENHANCEDUI_SUPPORT) ExecuteCallbackFunction(CB_ONGUIEND); #endif #ifdef NSIS_CONFIG_PLUGIN_SUPPORT Plugins_SendMsgToAllPlugins(NSPIM_GUIUNLOAD); #endif return ret; } } #endif//NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_CONFIG_SILENT_SUPPORT #ifdef NSIS_CONFIG_VISIBLE_SUPPORT else #endif//NSIS_CONFIG_VISIBLE_SUPPORT { if (install_thread(NULL)) { #ifdef NSIS_SUPPORT_CODECALLBACKS if (!g_quit_flag) ExecuteCallbackFunction(CB_ONINSTFAILED); #endif//NSIS_SUPPORT_CODECALLBACKS return 2; } #ifdef NSIS_SUPPORT_CODECALLBACKS ExecuteCallbackFunction(CB_ONINSTSUCCESS); #endif//NSIS_SUPPORT_CODECALLBACKS return 0; } #endif//NSIS_CONFIG_SILENT_SUPPORT }
FORCE_INLINE int NSISCALL ui_doinstall(void) { header *header = g_header; static WNDCLASS wc; // richedit subclassing and bgbg creation // detect default language // more information at: // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/nls_0xrn.asp LANGID (WINAPI *GUDUIL)(); static const char guduil[] = "GetUserDefaultUILanguage"; GUDUIL = myGetProcAddress(TEXT("KERNEL32.dll"), (char *) guduil); if (GUDUIL) { // Windows ME/2000+ myitoa(state_language, GUDUIL()); } else { *(DWORD*)state_language = CHAR4_TO_DWORD('0', 'x', 0, 0); { // Windows 9x static const TCHAR reg_9x_locale[] = TEXT("Control Panel\\Desktop\\ResourceLocale"); myRegGetStr(HKEY_CURRENT_USER, reg_9x_locale, NULL, g_tmp); } if (!g_tmp[0]) { // Windows NT // This key exists on 9x as well, so it's only read if ResourceLocale wasn't found static const TCHAR reg_nt_locale_key[] = TEXT(".DEFAULT\\Control Panel\\International"); static const TCHAR reg_nt_locale_val[] = TEXT("Locale"); myRegGetStr(HKEY_USERS, reg_nt_locale_key, reg_nt_locale_val, g_tmp); } mystrcat(state_language, g_tmp); } // set default language set_language(); // initialize auto close flag g_exec_flags.autoclose=g_flags&CH_FLAGS_AUTO_CLOSE; // read install directory from registry if (!is_valid_instpath(state_install_directory)) { if (header->install_reg_key_ptr) { myRegGetStr( (HKEY)header->install_reg_rootkey, GetNSISStringNP(header->install_reg_key_ptr), GetNSISStringNP(header->install_reg_value_ptr), ps_tmpbuf ); if (ps_tmpbuf[0]) { TCHAR *p=ps_tmpbuf; TCHAR *e; if (p[0]==TEXT('\"')) { TCHAR *p2; p++; p2 = findchar(p, TEXT('"')); *p2 = 0; } // p is the path now, check for .exe extension e=p+mystrlen(p)-4; if (e > p) { // if filename ends in .exe, and is not a directory, remove the filename if (!lstrcmpi(e, TEXT(".exe"))) // check extension { DWORD d; d=GetFileAttributes(p); if (d == INVALID_FILE_ATTRIBUTES || !(d&FILE_ATTRIBUTE_DIRECTORY)) { // if there is no back-slash, the string will become empty, but that's ok because // it would make an invalid instdir anyway trimslashtoend(p); } } } mystrcpy(state_install_directory,addtrailingslash(p)); } } } if (!is_valid_instpath(state_install_directory)) { GetNSISString(state_install_directory,header->install_directory_ptr); } #ifdef NSIS_CONFIG_LOG if (g_flags & CH_FLAGS_SILENT_LOG && !g_is_uninstaller) { #if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT) build_g_logfile(); #endif log_dolog=1; } #endif #ifdef NSIS_CONFIG_VISIBLE_SUPPORT g_hIcon=LoadImage(g_hInstance,MAKEINTRESOURCE(IDI_ICON2),IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_SHARED); #ifdef NSIS_SUPPORT_BGBG if (header->bg_color1 != -1) { QTCHAR cn = CHAR4_TO_DWORD(TEXT('_'), TEXT('N'), TEXT('b'), 0); RECT vp; extern LRESULT CALLBACK BG_WndProc(HWND, UINT, WPARAM, LPARAM); wc.lpfnWndProc = BG_WndProc; wc.hInstance = g_hInstance; wc.hIcon = g_hIcon; //wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.lpszClassName = (LPCTSTR)&cn; if (!RegisterClass(&wc)) return 0; SystemParametersInfo(SPI_GETWORKAREA, 0, &vp, 0); m_bgwnd = CreateWindowEx(WS_EX_TOOLWINDOW,(LPCTSTR)&cn,0,WS_POPUP, vp.left,vp.top,vp.right-vp.left,vp.bottom-vp.top,0,NULL,g_hInstance,NULL); } #endif//NSIS_SUPPORT_BGBG #endif//NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_SUPPORT_CODECALLBACKS // Select language if (ExecuteCallbackFunction(CB_ONINIT)) return 2; set_language(); #endif #ifdef NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_CONFIG_SILENT_SUPPORT if (!g_exec_flags.silent) #endif//NSIS_CONFIG_SILENT_SUPPORT { #ifdef NSIS_SUPPORT_BGBG ShowWindow(m_bgwnd, SW_SHOW); #endif//NSIS_SUPPORT_BGBG #ifdef NSIS_CONFIG_LICENSEPAGE { // load richedit DLL static TCHAR str1[]=TEXT("RichEd20.dll"); #ifdef UNICODE static wchar_t str2[]=L"RichEdit20W"; #else static char str2[]="RichEdit20A"; #endif if (!LoadLibrary(str1)) { *(DTCHAR*)(str1+6) = CHAR2_TO_WORD(TEXT('3'),TEXT('2')); LoadLibrary(str1); } // make richedit20a point to RICHEDIT if (!GetClassInfo(NULL,str2,&wc)) { str2[8]=0; GetClassInfo(NULL,str2,&wc); wc.lpszClassName = str2; str2[8]=TEXT('2'); RegisterClass(&wc); } } #endif { int ret=DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_INST+dlg_offset),0,DialogProc); #if defined(NSIS_SUPPORT_CODECALLBACKS) && defined(NSIS_CONFIG_ENHANCEDUI_SUPPORT) ExecuteCallbackFunction(CB_ONGUIEND); #endif return ret; } } #endif//NSIS_CONFIG_VISIBLE_SUPPORT #ifdef NSIS_CONFIG_SILENT_SUPPORT #ifdef NSIS_CONFIG_VISIBLE_SUPPORT else #endif//NSIS_CONFIG_VISIBLE_SUPPORT { if (install_thread(NULL)) { #ifdef NSIS_SUPPORT_CODECALLBACKS if (!g_quit_flag) ExecuteCallbackFunction(CB_ONINSTFAILED); #endif//NSIS_SUPPORT_CODECALLBACKS return 2; } #ifdef NSIS_SUPPORT_CODECALLBACKS ExecuteCallbackFunction(CB_ONINSTSUCCESS); #endif//NSIS_SUPPORT_CODECALLBACKS return 0; } #endif//NSIS_CONFIG_SILENT_SUPPORT }
ZString ZVersionInfo::GetStringValue(LPCTSTR pszKey, bool* pbExists) const { // Initialize the [out] parameter if (pbExists) *pbExists = false; // Ensure that we have a non-NULL key if (!pszKey) { SetLastError(ERROR_INVALID_PARAMETER); return ZString(); } // Determine if a LANGID was specified LANGID wLangID = LANGID((LANGID(-1) == GetLanguageID()) ? MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) : GetLanguageID()); // Determine if a code page was specified WORD rgwCodePages[] = { 1200, // Unicode 1252, // Windows Multilingual 0000, // Neutral }; int cCodePages = sizeofArray(rgwCodePages); if (WORD(-1) != m_wCodePage) { rgwCodePages[0] = m_wCodePage; cCodePages = 1; } // Format the base sub-block string TCHAR szBase[32]; _stprintf_s(szBase, 32, TEXT("\\StringFileInfo\\%04X"), wLangID); // Loop thru each code page for (int iCP = 0; iCP < cCodePages; ++iCP) { // Format a sub-block string TCHAR szSubBlock[_MAX_PATH * 2]; _stprintf_s(szSubBlock, _MAX_PATH * 2, TEXT("%s%04X\\%s"), szBase, rgwCodePages[iCP], pszKey); // Query the value UINT cbValue = 0; LPCTSTR pszValue = NULL; if (VerQueryValue(m_pVerInfo, szSubBlock, (void**)&pszValue, &cbValue)) { // Indicate that the key exists if (pbExists) *pbExists = true; // Indicate success SetLastError(0); return ZString(pszValue); } } // Indicate success SetLastError(0); return ZString(); }
// Based on the code from C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc\appcore.cpp // with modification for our multiple lanugage support in VC6. LANGID CMultiLanguage::DetectUILanguage() { LANGID langid = 0; int nPrimaryLang = 0; int nSubLang = 0; LCID lcid = 0; PFNGETUSERDEFAULTUILANGUAGE pfnGetUserDefaultUILanguage; PFNGETSYSTEMDEFAULTUILANGUAGE pfnGetSystemDefaultUILanguage; HINSTANCE hKernel32; hKernel32 = ::GetModuleHandle(_T("kernel32.dll")); ASSERT(hKernel32 != NULL); pfnGetUserDefaultUILanguage = (PFNGETUSERDEFAULTUILANGUAGE)::GetProcAddress( hKernel32, "GetUserDefaultUILanguage"); if(pfnGetUserDefaultUILanguage != NULL) { // First, try the user's UI language langid = pfnGetUserDefaultUILanguage(); AddLangId( langid ); TRACE(_T("CMultiLanguage::DetectUILanguage() 1st/2nd = %04X\n"), langid ); // Then, try the system's default UI language pfnGetSystemDefaultUILanguage = (PFNGETSYSTEMDEFAULTUILANGUAGE)::GetProcAddress( hKernel32, "GetSystemDefaultUILanguage"); ASSERT( pfnGetSystemDefaultUILanguage != NULL ); langid = pfnGetSystemDefaultUILanguage(); AddLangId( langid ); TRACE(_T("CMultiLanguage::DetectUILanguage() 3rd/4th = %04X\n"), langid ); } else { // We're not on an MUI-capable system. if (::GetVersion()&0x80000000) { // We're on Windows 9x, so look in the registry for the UI language HKEY hKey = NULL; LONG nResult = ::RegOpenKeyEx(HKEY_CURRENT_USER, _T( "Control Panel\\Desktop\\ResourceLocale" ), 0, KEY_READ, &hKey); if (nResult == ERROR_SUCCESS) { DWORD dwType; TCHAR szValue[16]; ULONG nBytes = sizeof( szValue ); nResult = ::RegQueryValueEx(hKey, NULL, NULL, &dwType, LPBYTE( szValue ), &nBytes ); if ((nResult == ERROR_SUCCESS) && (dwType == REG_SZ)) { DWORD dwLangID; int nFields = _stscanf( szValue, _T( "%x" ), &dwLangID ); if( nFields == 1 ) { langid = LANGID( dwLangID ); AddLangId( langid ); TRACE(_T("CMultiLanguage::DetectUILanguage() 9X1st/2nd = %04X\n"), langid ); } } ::RegCloseKey(hKey); } } else { // We're on NT 4. The UI language is the same as the language of the // version resource in ntdll.dll HMODULE hNTDLL = ::GetModuleHandle( _T( "ntdll.dll" ) ); if (hNTDLL != NULL) { langid = 0; ::EnumResourceLanguages( hNTDLL, RT_VERSION, MAKEINTRESOURCE( 1 ), _AfxEnumResLangProc, reinterpret_cast< LONG_PTR >( &langid ) ); if (langid != 0) { AddLangId( langid ); TRACE(_T("CMultiLanguage::DetectUILanguage() NT1st/2nd = %04X\n"), langid ); } } } } if ( m_nLocales < MAX_NUM_LCID ) { m_alcidSearch[m_nLocales] = LOCALE_SYSTEM_DEFAULT; m_nLocales++; } else { m_alcidSearch[MAX_NUM_LCID-1] = LOCALE_SYSTEM_DEFAULT; m_nLocales = MAX_NUM_LCID; } return LANGIDFROMLCID(m_alcidSearch[0]); }
CWindowsVersion::CWindowsVersion() { m_osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if(!GetVersionEx(&m_osv)) { ASSERT(0); // make sure nothing bad will happen trying to interpret OSVERSIONINFO memset((void*)&m_osv, 0, sizeof(m_osv)); } else { switch(m_osv.dwPlatformId) { case VER_PLATFORM_WIN32s: //Win32s on Windows 3.1. m_winVer = WV_32S; break; case VER_PLATFORM_WIN32_WINDOWS: //WIN32 on 95 or 98 or ME if(m_osv.dwMinorVersion == 0) { m_winVer = WV_95; } else if(m_osv.dwMinorVersion == 10) { m_winVer = WV_98; } if(m_osv.dwMinorVersion == 90) { m_winVer = WV_ME; } break; case VER_PLATFORM_WIN32_NT: //Win32 on Windows NT. if(m_osv.dwMajorVersion == 4) { m_winVer = WV_NT4; } else if(m_osv.dwMajorVersion >= 5) { m_winVer = WV_2K; } break; default: m_winVer = WV_UNKNOWN; break; } } // get the language m_UILang = 0; switch(m_winVer) { case WV_2K: { // Disable this section to emulate Windows NT before Windows 2000, when testing // on Windows 2000 // Use GetUserDefaultUILanguage to find the user's prefered UI language // Declare function pointer LANGID (WINAPI *pfnGetUserDefaultUILanguage) () = NULL ; HMODULE hMKernel32 = LoadLibraryW(L"kernel32.dll") ; pfnGetUserDefaultUILanguage = (unsigned short (WINAPI *)(void)) GetProcAddress(hMKernel32, "GetUserDefaultUILanguage") ; if(NULL != pfnGetUserDefaultUILanguage) m_UILang = pfnGetUserDefaultUILanguage() ; } break; case WV_NT4: { // Running on Windows NT 4.0 or earlier. Get UI language // from locale of .default user in registry: // HKEY_USERS\.DEFAULT\Control Panel\International\Locale CRegKeyEx key; if(ERROR_SUCCESS == key.Open(HKEY_USERS, _T(".DEFAULT\\Control Panel\\International"), KEY_READ)) { CString value = key.QueryValueString(_T("Locale")); m_UILang = (LANGID)_tcstol(value,NULL,16); }; } break; case WV_95: case WV_98: case WV_ME: { // Running on Windows 9x. Get the system UI language from registry: CRegKeyEx key; if(ERROR_SUCCESS == key.Open(HKEY_USERS, _T(".Default\\Control Panel\\desktop\\ResourceLocale"), KEY_READ)) { CString value = key.QueryValueString(_T("")); m_UILang = (LANGID)_tcstol(value, 0, 16); }; } break; } // get the common controls dll version m_comCtl32Version = GetDllVersion(_T("comctl32.dll")); }
INT __cdecl wmain( INT argc, PWSTR argv[] ) /*++ Routine Description: This routine is the 'main' routine for the tool 'fscutl'. Arguments: argc - The argument count. argv - Array of Strings of the form : ' fscutl <command> <options/flags> <parameters> ...' Return Value: INT - Return Status --*/ { PCOMMAND_VECTOR Cmds = NULL; PCOMMAND_VECTOR Cmds2 = NULL; OSVERSIONINFOEX OsVer; #if FALSE LANGID (WINAPI *pSetThreadUILanguage)( ) = NULL; if (pSetThreadUILanguage == NULL) { pSetThreadUILanguage = (PVOID) GetProcAddress( GetModuleHandle( TEXT( "kernel32" )), "SetThreadUILanguage" ); } if (pSetThreadUILanguage == NULL) { SetThreadLocale( MAKELCID( MAKELANGID( LANG_ENGLISH, SUBLANG_ENGLISH_US ), SORT_DEFAULT )); } else { (*pSetThreadUILanguage)( 0 ); } #endif setlocale( LC_ALL, ".OCP" ) ; SHIFT( argc, argv ); OsVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if (GetVersionEx( (LPOSVERSIONINFO)&OsVer ) && OsVer.dwMajorVersion == 5 && OsVer.dwMinorVersion == 0) { RunningOnWin2K = TRUE; } if (!IsUserAdmin()) { DisplayMsg( MSG_ADMIN_REQUIRED ); return EXIT_CODE_FAILURE; } // // Check for blind usage // if (argc == 0) { Help( 0, NULL ); return EXIT_CODE_SUCCESS; } // // We have a two-level dispatch scheme. First level selects a table and second // selects a function // Cmds = FindCommand( CmdVectorGroups, argv[0] ); if (Cmds == NULL) { DisplayMsg( MSG_INVALID_PARAMETER, argv[0] ); Help( 0, NULL ); return EXIT_CODE_FAILURE; } SHIFT( argc, argv ); // // If there's no argument, then it's a cry for help // if (argc == 0) { Cmds2 = FindCommand( Cmds->CommandVector, L"?" ); Cmds2->CommandFunc( argc, argv ); return EXIT_CODE_SUCCESS; } // // Go to second level dispatch. // Cmds2 = FindCommand( Cmds->CommandVector, argv[0] ); if (Cmds2 == NULL) { DisplayMsg( MSG_INVALID_PARAMETER, argv[0] ); Cmds2 = FindCommand( Cmds->CommandVector, L"?" ); SHIFT( argc, argv ); Cmds2->CommandFunc( argc, argv ); return EXIT_CODE_FAILURE; } SHIFT( argc, argv ); return Cmds2->CommandFunc( argc, argv ); }