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

24.3.1.Ansi-версия программы для среды mvs 6.0.

В качестве примера использования файла инициализации приведем такую программу (среда MVS 6.0, использование кодировки ANSI):

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

[ELEPHANT]

LegsNumber=3

FName=Инвалид

Здесь ELEPHANT – имя секции, LegsNumber и FName – имена ключей, а 3 и Инвалид – значения указанных ключей соответственно.

В ini-файле может быть произвольное число секций и в каждой секции – произвольное число ключей.

24.3.2.Unicode-версия программы для ис mvs-2005 и mvs-2008.

Приведенная выше программа будет (по крайней мере должна, если она с этим согласна) функционировать корректно, если ее компилировать в среде MVS 6.0. В среде MVS-2005 она работать не будет, так как по умолчанию в ИС MVS-2005 установлена кодировка Unicode (см. раздел «Интегрированная среда MVS-2005» в этом документе). Та же программа для ИС MVS-2005 (с установленной по умолчанию кодировкой Unicode) может быть реализована так, как в приведенном ниже листинге.

Некоторые комментарии к этой версии программы, использующей кодировку Unicode (установлена в свойствах проекта ИС MVS-2005 по умолчанию).

Тип wchar_t трактуется как символы Unicode (2-байтные).

Метод CString::GetBuffer() возвращает указатель на строку, хранящуюся в классе CString.

Функция WideCharToMultiByte() с множеством параметров предназначена для преобразования символов из кодировки Unicode в кодировку ANSI (кодовая страница 866 – OEM-Russia).

Более подробные сведения об обработке строк символов см. в подразделе «Обработка строк» этого руководства.

В целом приведенные в этой программе приемы, т.е. использование функций CharToOemA(), WideCharToMultiByte() и, частично, класса CString, должны были проиллюстрировать Вам (надеюсь, что так оно и случилось) сложности и способы работы с символами кириллицы в среде MVS-2005 при разработке консольных приложений. В приложениях с графическим интерфейсом (GUI application), к счастью, с символами кириллицы дело обстоит легче (несомненно, что Вы обратили внимание на передачу текста на русском языке в функцию вывода окна сообщения AfxMessageBox()).

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

Еще раз хочу подчеркнуть, что в приведенном виде программа будет компилироваться и выполняться, если в свойствах проекта (ProjectPropertiesGeneral) для параметра Character Set выбрано значение по умолчанию “Use Unicode Character Set”.

Ниже приведен код, который позволяет задать имя файла инициализации (для консольного приложения) другим способом, отличным от приведенного выше. В нем использован тот факт, что в функцию _tmain() параметром TCHAR* argv[] передается системой полное имя исполняемого файла. Таким образом, вызов функции SetIniFileName2() в функции _tmain() может выглядеть так:

if(!SetIniFileName2(argv[0])) AfxMessageBox("Ошибка при изменении имени ini-файла");

/* SetIniFileName2() задает новое имя ini-файла, точнее, новый путь,

используя тот факт, что в качестве параметра в функцию _tmain Windows

передает полное имя приложения, например, "C:\Temp\IninFile\Debug\IniFile.exe".

Если этого не сделать, то ini-файл будет записываться в каталог Windows,

что, как на мой взгляд, не есть хорошо

*/

bool SetIniFileName2(TCHAR* ExeFullName)

{

CString Work=ExeFullName; // делаем копию параметра

Work.Delete(Work.GetLength()-3,3); /* удаляем из полного имени файла

три последних символа - ехе*/

Work+="ini"; /* добавляем к имени файла три последних символа,

получая таким образом имя файла инициализации*/

free((void *)theApp.m_pszProfileName); /* освобождение памяти, выделенной

для старого имени ini-файла системой*/

theApp.m_pszProfileName=_tcsdup(Work); /* назначаем новое имя ini-файла */

return true;

}

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