Как стать автором
Обновить

Список функций для получения текста ошибок из их кодов (WinAPI)

Время на прочтение2 мин
Количество просмотров10K


Здраствуйте!

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

1. FormatMessage

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

Пример:
Функция получает текст ошибки из кода системных ошибок

// пример получения текста системной ошибки
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, 1337, 0, lpszBuffer, cchBuffer, NULL);

printf("Error Code: %d\nError Name: %s", 1337, lpszBuffer);


Результат:
Error Code: 1337
Error Text: Идентификатор безопасности имеет неверную структуру.

2. FormatMessage + FORMAT_MESSAGE_FROM_HMODULE

При установленном флаге FORMAT_MESSAGE_FROM_HMODULE можно загрузить список ошибок из модуля (DLL) в котором находится список ошибок:
  • ntdll.dll — список ошибок NTSTATUS
  • wininet.dll — список ошибок Wininet
  • pdh.dll — список ошибок Performance Data Helper
  • … допишите в комментариях если знаете ещё


Также этот метод можно использовать и в своих проектах, нужно лишь упаковать ресурс типа message table внутрь библиотеки (спасибо ertaquo)

Пример:
В этом примере база ошибок загружается из файла ntdll.dll

// загружаем ntdll.dll для получения текста NTSTATUS ошибки
FormatMessage(FORMAT_MESSAGE_FROM_HMODULE, LoadLibrary("ntdll.dll"), -1072037872, 0, lpszBuffer, cchBuffer, NULL);

printf("Error Code: %d\nError Name: %s", -1072037872, lpszBuffer);


Результат:
Error Code: -1072037872
Error Text: Служба журнала обнаружила попытку ошибочного выделения или освобождения зарезервированного пространства.

3. DXGetErrorString & DXGetErrorDescription

  • DXGetErrorString — функция для получения имени ошибки (например ERROR_INVALID_SID)
  • DXGetErrorDescription — функция для получения текста ошибки (например The security ID structure is invalid.)


Пример:
Пример получения ошибки DirectX:

// получение текста DirectX ошибки
printf("Error Code: %d\nError Name: %s\nError Text: %s", 1337, DXGetErrorString((HRESULT)1337), DXGetErrorDescription((HRESULT)1337));


Результат:
Error Code: 1337
Error Name: ERROR_INVALID_SID
Error Text: The security ID structure is invalid.

4. RasGetErrorString

Эта функция для получает текст ошибки из библиотеки функций RAS

Пример:
Функция получает текст ошибки из кода RAS ошибок

// пример получения текста RAS ошибки
RasGetErrorString(633, lpszBuffer, cchBuffer);

printf("Error Code %d\nError Text: %s", 633, lpszBuffer);


Результат:
Error Code: 633
Error Text: Модем или другое устройство связи уже используется или не настроено.

5. GetIpErrorString

Эта функция для получения текста ошибки из библиотеки функций IP Helper Library

Пример:
Функция получает текст ошибки

// получаем текст ошибки IP Helper Library
GetIpErrorString(12, lpszBuffer, cchBuffer);

printf("Error Code %d\nError Text: %s", 12, lpszBuffer);


Результат:
Error Code: 12
Error Text: General failure.

Бонус

Ссылки на скачивание программы
Теги:
Хабы:
Всего голосов 38: ↑31 и ↓7+24
Комментарии11

Публикации

Истории

Работа

QT разработчик
8 вакансий
Программист С
46 вакансий
Программист C++
133 вакансии

Ближайшие события