Приложение на основе диалога
Таблица. 4.1 Формат кода Win32-ошибок.
31-30 | 29 | 28 | 27-16 | 15-0 |
Severity | С | R | Facility | Code |
Таблица. 4.2 Формат HRESULT СОМ-ошибок.
31 | 30 | 29 | 28 | 27 | 15-0 | 26-16 |
S | R1 | С1 | N | r | Code | Facility |
Символы имеют следующий смысл:
- с – Customer code flag (флаг пользователя);
- R – Reserved (зарезервировано для будущего использования);
- s – Severity (Успех или неудача);
- R1, C1, N, г – зарезервированная часть кода Facility.
Два старших бита Win32-oum6oK кодируют такие категории степени ошибки:
- 00 – Success (Успех);
- 01 – Informational (Информационное сообщение);
- 10 – Warning (Предупреждение);
- 11 – Error (Отказ).
Зададимся целью разработать приложение, которое можно назвать анализатором кодов ошибок. С его помощью пользователь, зная код ошибки, сможет быстро получить всю информацию, которая хранится в файле WinError.h и связана именно с этой ошибкой. На примере разработки приложения мы продемонстрируем такие технологические приемы, как:
- создание приложения на основе диалога;
- работа с текстовыми строками и потоками ввода-вывода, определенными в STL (Standard Template Library);
- использование стандартного диалога по поиску папки;
- поиск в реестре Windows.
Основная идея приложения заключается в том, что при его открытии происходит попытка с помощью реестра найти файл WinError.h, сканировать его и заполнить динамический контейнер структур с информацией обо всех ошибках. Далее пользователь имеет возможность либо просматривать информацию об ошибках, последовательно проходя по элементам контейнера, либо ввести код ошибки и увидеть результат его трансляции (расшифровки). Форматы битовых полей HRESULT подсказывают состав полей структуры, которую можно использовать для хранения информации об ошибке:
//====== Тип стуктур для описания ошибок struct ErrorType { string Code; // Код ошибки string Identifier; // Ее идентификатор string Message; // Текстовое описание //======= Конструктор с параметрами ErrorType(string с, string i, string m) { Code = c; Identifier = i; Message = m; } };
Так как мы собираемся использовать контейнер структур такого типа, то полезно определить новый тип:
typedef vector<ErrorType> ERROR_VECTOR;
Определения такого типа упрощают создание ссылок на контейнеры или на его составные части. Перед тем как мы приступим к разработке приложения, отметим, что MFC-приложения на основе диалога имеют некоторые преимущества перед другими типами приложений. Главным из них является простота структуры классов и возможность пользоваться глобальными функциями MFC для обмена данными между окнами и переменными диалогового класса. Надо признать, что Эти функции (типа DDX_– Dynamic Data Exchange и DDV_ – Dynamic Data Validation) очень удобны и надежны. Конечно, приложения рассматриваемого типа не обладают такими разнообразными возможностями, как приложения типа MDI (Multiple Document Interface), но для определенного класса задач они являются оптимальным выбором.