Иллюстрированный самоучитель по Visual Studio .NET

Приложение на основе диалога

Таблица. 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), но для определенного класса задач они являются оптимальным выбором.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.