Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC_Lect.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
15 Мб
Скачать
☆

23.1.8.Функция GetSystemInfo

Функция GetSystemInfo возвращает адрес структуры, содержащей информацию о системе.

VOID GetSystemInfo(

LPSYSTEM_INFO lpSystemInfo // адрес структуры, содержащей информацию

// о системе

);

Функция не возвращает никакого значения.

Параметр:

lpSystemInfo – указатель на структуру SYSTEM_INFO, которую заполняет функция.

Пример использования функции GetSystemInfo (и еще многих других) содержится в проекте SysInfo_Demo. Авторы: Alexey Kazakovsky, Stas Khirman и Raz Galili.

24.Разное-всякое

24.1.Русификация приложений

Речь идет, прежде всего, о русификации приложений, разрабатываемых в Visual C++ 6.0, хотя многое относится и к приложениям, разрабатываемым в аналогичной среде другой версии, например, Microsoft Visual Studio 2005 или 2008.

Русификация консольных приложений.

Для того чтобы можно было выводить символы кириллицы на монитор (например cout<<”Покупайте память!”;), надо поступить таким образом:

char s[]="Покупайте память!";

CharToOemA(s,s); // переводит из кодировки Windows в кодировку DOS

cout<<s<<endl;

Такое преобразование символов с помощью функции CharToOemA необходимо потому, что в тексте программы символы кириллицы записаны в кодировке Windows (1251), а при выводе на монитор (в консольном приложении) они должны быть заданы в кодировке MS DOS (866). С англоязычными символами никаких проблем нет потому, что первые 128 символов в обеих кодировках совпадают, а именно в этой группе и находятся буквы английского языка (см. подраздел «Кодировки и кодовые страницы»).

.

Если консольное приложение вводит с клавиатуры русский текст и его же выводит, то никакого преобразования символов не требуется, например:

char s[129];

cin>>s; // вводим “Сало”

cout<<s; // выводит “Сало”

Из соображений удобства можно написать такую простую функцию перекодировки для консольных приложений:

char Buf[1024]; /*предполагается, что длина преобразуемой строки не будет превышать 1024. В реальной программе надо бы предусмотреть проверку длины обрабатываемой строки либо выполнять локализацию вообще по-иному*/

char * Rus(char *Str)

{

CharToOemA(Str,Buf);

return Buf;

}

Надо заметить, что в этом примере явно указана ANSI-версия функции CharToOemA(), а не версия для Unicode. Версия для Unicode имеет другое имя – CharToOemW().

При наличии такой функции вывод текста на русском языке в консольном приложении будет выглядеть так:

cout<<Rus(“Баба Яга - королева красоты!”)<<endl;

Способы русификации консольных приложений зависят от того, какой набор символов (character set) предполагается использовать в приложении: ANSI, Unicode или MBCS. Этот набор символов надо установить в свойствах проекта: команда меню ProjectProperties, а далее выбираем Configuration PropertiesGeneral и нужное значение для Character Set в правой панели. (рис.4.1). Более подробные сведения по русификации, с примерами, можно найти в подразделе данного конспекта «Использование ini-файла».

Замечание. Из соображений мобильности и простоты я бы рекомендовал, в настоящее время, использовать всегда кодировку Unicode

Рис. 4.1. Выбор кодировки символов для проекта

В программе символы Unicode или строки таких символов описывают с помощью идентификаторов wchar_t или TCHAR, например:

wchar_t WBuf[1024]=_T(”Заткнигузно”);

TCHAR WBuf2[]=L”Заткнигузно”;

Идентификатор TCHAR использовать удобнее в том случае, когда проект может компилироваться с использованием кодировки Unicode или без нее; в этом случае он означает одно- или двубайтный символ в зависимости от настроек проекта.

Использование макроса _T или символа L равнозначно (вместо _T иногда используют TEXT, что равнозначно). Символы Unicode можно вводить с клавиатуры или выводить на монитор с помощью объектов стандартной библиотеки wcin и wcout соответственно, например:

wcin>>WBuf;

wcout<<WBuf2<<endl;

При этом, однако, будут те же проблемы с символами кириллицы, что и при использовании ANSI-символов. Преобразование символов Unicode в кодировку ANSI (однобайтные символы) можно выполнить с помощью функции CharToOemW, например так:

char Buf[1024];

wchar_t WBuf2[1024]=L"Авиация";

CharToOemW(WBuf,Buf);

cout<<Buf<<endl; // выводит слово Авиация

Если в консольном приложении для обработки символов используется класс CString, то вывести значение строки на экран можно так:

char Buf[1024];

CString temp("Дятел клавиатуры");

CharToOemW(temp.GetBuffer(),Buf);

cout<<Buf<<endl;

Для преобразования символов Unicode в любую кодировку, в частности, и в 866 (кириллица MS DOS), можно использовать и функцию WideCharToMultiByte:

char Buf[1024];

WideCharToMultiByte(866,WC_NO_BEST_FIT_CHARS, L"Студент",-1,Buf,sizeof(Buf),0,0);

cout<<Buf<<endl;

CString temp("Еще один дятел клавиатуры");

WideCharToMultiByte(866,WC_NO_BEST_FIT_CHARS, temp.GetBuffer(),

-1,Buf,sizeof(Buf),0,0);

cout<<Buf<<endl;

Для преобразования в кодировку Windows в качестве первого параметра необходимо указать 1251.

Для обратного преобразования служит функция MultiByteToWideChar. Параметры обеих функций рассматриваются в подразделе «Перекодировка строк из Unicode в ANSI и обратно» работы [8a]. В той же работе рекомендую почитать подраздел «Рекомендуемые приемы работы с символами и строками».

Для того чтобы определить кодировку текста в текстовом файле можно использовать функцию IsTextUnicode(), поддерживаемую библиотекой AdvApi32.dll и объявленную в WinBase.h [8a].

Еще одним способом преобразования символов Unicode (wchar_t) в char является функция

size_t wcstombs(char *mbstr, const wchar_t *wcstr, size_t count );

Однако ее существенным недостатком является тот факт, что символы кириллицы она не распознает и просто «выбрасывает» из результирующей строки, например:

static char Buf[1024];

CString str;

str="// ABCDEFG вызов диалогового окна Cancel";

wcstombs(Buf,str.GetBuffer(),sizeof(Buf));

// Buf = = "// ABCDEFG"

«Безопасная» функция wcstombs_s ведет себя еще хуже.

Русифицировать (консольное) приложение можно и путем вызова функции setlocale(LC_ALL,"rus"), которая, упрощенно говоря, устанавливает русский язык в качестве языка ввода/вывода. Эту функцию достаточно вызвать один раз при запуске программы на выполнение – проще всего в начале функции _tmain().

Русификация оконных приложений.

В оконных приложениях, так же как и консольных, предпочтительнее использование кодировки Unicode везде, где это возможно. Символы кириллицы, как правило, корректно отображаются в управляющих элементах. При создании каркаса приложения надо в свойствах проекта выбирать «Русский» в списке Resource language.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]