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

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

Уверен, что многие из читателей, разрабатывая свой код или запустив чужой многообещающий код, получали сообщение типа:

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 технологий.

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