bool IsCodePageSupported(UINT CodePage) { // Для стандартных кодовых страниц ничего проверять не надо // BUGBUG: мы не везде поддержиаем все стандартные кодовые страницы. Это не проверяется if (CodePage == CP_AUTODETECT || IsStandardCodePage(CodePage)) return true; CPINFOEX cpiex; return GetCodePageInfo(CodePage, cpiex); }
bool IsCodePageSupported(uintptr_t CodePage) { // Для стандартных кодовых страниц ничего проверять не надо // BUGBUG: мы не везде поддержиаем все стандартные кодовые страницы. Это не проверяется if (CodePage == CP_DEFAULT || IsStandardCodePage(CodePage)) return true; // Проходим по всем кодовым страницам системы и проверяем поддерживаем мы или нет её CallbackCallSource = CodePageCheck; currentCodePage = CodePage; CodePageSupported = false; EnumSystemCodePages((CODEPAGE_ENUMPROCW)EnumCodePagesProc, CP_INSTALLED); return CodePageSupported; }
// Callback-функция получения таблиц символов BOOL __stdcall EnumCodePagesProc(const wchar_t *lpwszCodePage) { UINT codePage = _wtoi(lpwszCodePage); // Получаем информацию о кодовой странице. Если информацию по какой-либо причине получить не удалось, то // для списков продолжаем енумерацию, а для процедуры же проверки поддерживаемости кодовой страницы выходим CPINFOEX cpiex; if (!GetCodePageInfo(codePage, cpiex)) { return CallbackCallSource == CodePageCheck ? FALSE : TRUE; } if (IsStandardCodePage(codePage)) { return TRUE; // continue } // Формируем имя таблиц символов bool IsCodePageNameCustom = false; wchar_t *codePageName = FormatCodePageName(_wtoi(lpwszCodePage), cpiex.CodePageName, sizeof(cpiex.CodePageName)/sizeof(wchar_t), IsCodePageNameCustom); // Получаем признак выбранности таблицы символов int selectType = 0; GetRegKey(FavoriteCodePagesKey, lpwszCodePage, selectType, 0); // Добавляем таблицу символов либо в нормальные, либо в выбранные таблицы симовлов if (selectType & CPST_FAVORITE) { // Если надо добавляем разделитель между выбранными и нормальными таблицами симовлов if (!favoriteCodePages) AddSeparator(MSG(MGetCodePageFavorites),GetItemsCount()-normalCodePages-(normalCodePages?1:0)); // Добавляем таблицу символов в выбранные AddCodePage( codePageName, codePage, GetCodePageInsertPosition( codePage, GetItemsCount()-normalCodePages-favoriteCodePages-(normalCodePages?1:0), favoriteCodePages ), true, selectType & CPST_FIND ? true : false, IsCodePageNameCustom ); // Увеличиваем счётчик выбранных таблиц символов favoriteCodePages++; } else if (CallbackCallSource == CodePagesFill || Opt.CPMenuMode) { // добавляем разделитель между стандартными и системными таблицами символов if (!favoriteCodePages && !normalCodePages) AddSeparator(MSG(MGetCodePageOther)); // Добавляем таблицу символов в нормальные AddCodePage( codePageName, codePage, GetCodePageInsertPosition( codePage, GetItemsCount()-normalCodePages, normalCodePages ), true, false, IsCodePageNameCustom ); // Увеличиваем счётчик выбранных таблиц символов normalCodePages++; } return TRUE; }