Приложение на основе диалога
Уверен, что многие из читателей, разрабатывая свой код или запустив чужой многообещающий код, получали сообщение типа:
0xC000000S STATUS_ACCESS_VIOLATION
Раньше, во времена DOS, довольно часто можно было видеть сообщение "General Protection Fault" ("Общая ошибка защиты"). Сообщения такого рода иногда вызывают чувство беспомощности и досады. Первая мысль – случилось что-то ужасное, вторая – неужели нельзя поподробнее объяснить причину отказа? Теперь, во времена COM (Component Object Model – Модель многокомпонентных объектов), количество ошибок и различного рода несоответствий драматически возрастает.
В файле WinError.h, который можно найти в папке Include Visual Studio 6, содержатся описания свыше 1300 кодов ошибок, а в 7-й версии этот же файл содержит описания уже свыше 2500 кодов. Не будет преувеличением сказать, что не каждый разработчик будет с энтузиазмом искать файл WinError.h, а затем искать в нем код своей очередной ошибки.
Анализируя файл WinError.h, можно заметить, что есть две категории ошибок. Первая категория – коды \Win32-ошибок, которые имеют вид десятичного числа, например:
#define ERROR_ACCESS_DENIED 5L
Надеюсь, вы не забыли, что суффикс ' L' задает тип константы (long). Вторая категория – это коды ошибок, возвращаемых многими OLE- и СОМ-АРI-функциями, например:
#define E_NOTIMPL _HRESULT_TYPEDEF_(0x80004001L)
Последние имеют вид шестнадцатеричных чисел, которые хранятся в переменных типа HRESULT.
Примечание
Этот тип не является еще одним описателем (Handle), как может показаться, судя по его имени. Он определен в файле WTypes.h оператором эквивалентности typedef LONG HRESULT и используется как набор битовых полей, имеющих определенный смысл. Самым необычным в этой ситуации является то, что суть ошибки (ее текстовое описание), то есть то, что более всего интересует программиста, присутствуете файле WinError.h в виде комментария. Вот фрагмент файла, который описывает одну ошибку:
// Messageld: ERROR_FILE_NOT_FOUND // // MessageText: // // The system cannot find the file specified. // #define ERROR FILE NOT FOUND 2L
В файле есть несколько макроопределений, которые позволяют выделять некоторые параметры сообщения, но они не дают возможности программным способом выделить поле MessageText, так необходимое нам с вами. В файле приведены описания двух форматов кодов ошибок. Один из них определяет Win32-ошибки, а другой – СОМ-ошибки. Оба имеют сходную структуру, но различаются в трактовке старших разрядов.
Общее для них поле (Code) содержит относительный код или позицию ошибки в группе ошибок, связанных с той или иной ветвью в дереве Windows-технологий. Группы заданы кодом Facility. Например, группа, определяемая кодом Facility=3, объединяет ошибки работы с памятью, а группа Facility=17 объединяет все коды ошибок, которые могут возникнуть при использовании технологии СОМ+. Мощность множества вариаций атрибута Facility в версии Studio .NET 7.0 больше (23), чем в Visual Studio 6 (16), так как возросло количество поддерживаемых Windows технологий.