Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Типы данных, используемые в Win32-приложениях



Мобильность программ и их независимость от конкретной платформы во многом обеспечивается введением новых стандартных типов данных - определенных на основе простых типов языка программирования Си. Имена стандартных типов данных состоят из символов верхнего регистра, для них не применяется оператор " *".

Полный перечень используемых данных можно увидеть в разделе \Plarform SDK \Win32 API\ Reference \ Data Types. Ниже приведен список наиболее распространенных типов: симовольных, целых, булевских, указателей и описателей (handles). Символьные, целые и булевские типы соответствуют аналогичным типам большинства диалектов языка Си. Имена типов-указателей содержат префикс " P" или " LP". Описатели имеют отношение к ресурсам, загруженным в память.

Наиболее часто используются следующие типы данных:

  • BOOL - булевская переменная (TRUE или FALSE );
  • CHAR - 8- разрядный символ;
  • DWORD - 32-разрядное беззнаковое целое;
  • HANDLE - описатель объекта;
  • INT - 32-разрядное целое;
  • LPSTR - указатель на строку 8-разрядных символов, заканчивающуюся нулем;
  • LPTSTR - LPWSTR в случае Unicode или LPSTR в случае ANSI;
  • LPVOID - указатель на любой тип;
  • LPWSTR - указатель на строку 16-разрядных (Unicode) символов, заканчивающуюся нулем;
  • TCHAR - WCHAR, в случае Unicode или CHAR в случае ANSI;
  • WCHAR - 16-разрядный Unicode символ;
  • WORD - 16-разрядное беззнаковое целое.

Остальные типы данных будут изучаться по мере необходимости. Некоторые Win32 приложения могут быть выполнены в среде более ранних версий ОС Windows, в том числе и 16-разрядных. Вследствие этого имена некоторых типов отражают систему адресации ОС MS-DOS, например, LP (long pointer) означает " длинный" указатель, а на самом деле - это обычный указатель.

В качестве самостоятельного упражнения рекомендуется ознакомиться с данными различных типов в справочной системе MSDN.

Unicode

В ОС Windows в качестве внутреннего формата для хранения и обработки текстовых строк используется Unicode. В Unicode каждый символ представляется 16-битным (двухбайтовым) кодом, что позволяет поддерживать разные языки и системы письменности (такие, как китайские и японские иероглифы).

Стандарт Unicode поддерживается консорциумом, в который входят такие компании, как Apple, Compaq, Hewlett-Packard, IBM, Microsoft и многие другие; подробная информация об этом имеется на сайте www.unicode.org. В справочнике MSDN соответствующие сведения хранятся в разделе \Visual Studio documentation\ Visual C++ Programmer's Guide \ Adding Program Functionality \ Overviews \ Unicode Programming.

Для совместимости со стандартами языков программирования и предыдущими версиями Windows в системе наряду с 16-битными (двухбайтовыми) символами активно используются и 8-битные (однобайтовые) ANSI символы. Так, многие Win32-функции, принимающие строковые параметры, существуют в двух версиях: для Unicode и для ANSI. Обычно при вызове ANSI-версии Win32-функции входные строковые параметры перед обработкой системой преобразуются в Unicode. В связи с этим перед разработчиками стоит задача написания приложений, способных работать с обеими кодировками.

Разработка приложений с использованием Unicode

Чтобы снизить зависимость приложения от используемой кодировки, целесообразно в программе определить два макроса -UNICODE и _UNICODE. Также рекомендуется использовать новый набор данных и функций, обрабатывающих строки и описанных в стандартных заголовочных файлах.

Обычно, имена Unicode данных и функций содержат префикс " wc" (от wide character), " w". Например, WCHAR - Unicode символ, wcscmp - функция сравнения Unicode строк. Можно также поставить префикс " L" перед текстовой строкой, например, L" Текстовая строка" - строка в формате Unicode.

Чтобы реализовать возможности компиляции двойного назначения, нужно включить в состав программы заголовочный файл tchar.h. Он состоит из макросов, которые ссылаются на Unicode данные и функции, если в программе определен макросUNICODE, и на ANSI - в противном случае. Так, для объявления символьного массива универсального назначения применяется тип TCHAR, который транслируется в WCHAR, если UNICODE определен, и в CHAR, если не определен. Аналогичным образом макросы с префиксом " l" переопределяют строковые функции (lstrlen вместо strlen и т.д.), а для определения символьных и строковых литералов применяется макрос _TEXT (или просто _T). Более подробно этот материал описан в [4].

Прогон программы вывода строки в формате Unicode

В качестве упражнения рекомендуется реализовать программу вывода строки " Hello, world".

#define UNICODE#ifdef UNICODE#define _UNICODE#endif#include < windows.h> #include < tchar.h> #include < stdio.h> void main() {PTCHAR TextString = _T(" Hello, world" ); _tprintf(_T(" String - %s\n" ), TextString); }

Необходимо убедиться, что программа одинаково работает в случае применения и отключения Unicode.

Прогон программы записи в файл в Unicode и обычном формате

Приведенная программа может вывести строку " Hello, world" в файл MyFile.txt в обычном формате и в формате Unicode.

#define UNICODE#ifdef UNICODE#define _UNICODE#endif#include < windows.h> #include < tchar.h> #include < stdio.h> void main() { HANDLE hFile; PTCHAR FileName = _T(" MyFile.txt" ); PTCHAR TextString = _T(" Hello, world." ); DWORD iWrite, StringLength = lstrlen(TextString); _tprintf(_T(" There are %ld symbols in text string %s\n" ), StringLength, TextString); hFile = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | 0, NULL); iWrite = StringLength; #ifdef UNICODE iWrite = 2*StringLength; #endif WriteFile(hFile, TextString, iWrite, & iWrite, NULL); printf(" %d bytes are written to file\n", iWrite); CloseHandle(hFile); }

Рекомендуется оба варианта получившегося файла просмотреть с помощью блокнота Nоtepad.

Обработка ошибок

Профессиональная разработка программных приложений предполагает включение кода для корректного восстановления после потенциальных ошибок. В случае возникновения ошибки система может справиться с ней самостоятельно, но в экстремальных ситуациях может потребоваться вмешательство пользователя.

Вызываемая Win32-функция может возвратить значение, свидетельствующее об ошибке (например, NULL для функций типа HANDLE или ноль для функций типа BOOL). В таких случаях можно попытаться выявить тип ошибки при помощи функции GetLastError - она возвращает код последней ошибки, который хранится в локальной памяти потока, вызвавшего ошибку. Коды ошибок (а их более 10 тысяч), представляющие собой 32-битные числа, находятся в заголовочном файле WinError.h.

Если приложение содержит функции, к которым обращаются другие программы, то желательно, чтобы эти функции синтезировали код ошибки в случае возникновения ошибочных ситуаций, то есть вели себя подобно функциям Win32 API. Это можно сделать при помощи функции SetLastError.

Для преобразования кода ошибки в ее содержательное описание предназначена Win32-функция FormatMessage. Получить описание ошибки по ее коду можно также с помощью утилиты errlook.exe, поставляемой в составе Visual Studio. Аналогичная информация содержится в справочной системе MSDN.

В тех случаях, когда об ошибке необходимо оповестить пользователя, можно использовать звуковой сигнал (функция MessageBeep). Для обработки ошибок также активно применяется структурная обработка исключений (Structured Exception Handling, см., [4], [10]).

Прогон программы, синтезирующей информацию об ошибке, которая имитирует отсутствие нужного файла

#include < windows.h> #include < stdio.h> void GetError() { DWORD dw = GetLastError(); printf(" GetLastError returned %u\n", dw); } void SetError() { DWORD dw = ERROR_FILE_NOT_FOUND; SetLastError (dw); } void main() { SetError(); GetError(); }

Рекомендуется реализовать данную программу и сверить номер выдаваемой ошибки с соответствующим перечнем в MSDN или файле заголовка WinError.h.


Поделиться:



Последнее изменение этой страницы: 2017-04-12; Просмотров: 324; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.011 с.)
Главная | Случайная страница | Обратная связь