Получение названия/описания кода ошибки системы Windows из его шестнадцатеричного номера

Я возился с некоторыми функциями windows, используя p/invoke. Иногда я получаю код ошибки, который не является ERROR_SUCCESS (такое нечетное имя).

Есть ли способ посмотреть их в рамках программы? Например, если я получу ошибку 1017. Могу ли я сообщить пользователю

Система попыталась загрузить или восстановить файл в реестре, но указанный файл не находится в формат файла реестра. (ERROR_NOT_REGISTRY_FILE: 0x3F9)

Вместо

Код ошибки: 1017

Ответ 1

Я не уверен, есть ли еще .NET-оболочка .NET, но вы можете вызвать API FormatMessage с помощью P/Invoke.

См. этот ответ о том, как он обычно вызывается из собственного кода. Хотя вопрос относится к захвату кодов ошибок из HRESULT, ответ также применяется для возврата кодов из обычных кодов ошибок ОС, поступающих из GetLastError/GetLastWin32Error).

EDIT: Спасибо Malfist за указание на pinvoke.net, который включает альтернативный управляемый API:

using System.ComponentModel;

string errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message;
Console.WriteLine(errorMessage);

Ответ 2

Вы можете взять определения из winerror.h в Политехнический институт Rensselaer и поместить их в Enum:

public enum Win32ErrorCode : long
{
     ERROR_SUCCESS = 0L,
     NO_ERROR = 0L,
     ERROR_INVALID_FUNCTION = 1L,
     ERROR_FILE_NOT_FOUND = 2L,
     ERROR_PATH_NOT_FOUND = 3L,
     ERROR_TOO_MANY_OPEN_FILES = 4L,
     ERROR_ACCESS_DENIED = 5L,
     etc.
}

Затем, если ваш код ошибки находится в переменной error_code, вы должны использовать:

Enum.GetName(typeof(Win32ErrorCode), error_code);

Ответ 3

Я приземлился на этой странице, находясь в поисках управляемой альтернативы вызову FormatMessage через P/Invoke.

Как говорили другие, нет возможности получить эти заглавные, подчеркнутые имена, не глядя на них в winerror.h, которые я видел в Интернете в разных местах, где я приземлялся в поисках информации о разрешение определенных кодов состояния. Быстрый поиск Google, для winerror.h, сам, раскрыл страницу в Rensselaer Polytechnic Instutute, где кто-то полезен извлек инструкции #define из он.

Взгляд на это дал мне представление; Я думаю, что там может быть способ добраться туда, работая из исходного кода winerror.h, который у меня есть, как часть SDK Windows Platform, который поставляется с каждой последней версией Microsoft Visual Studio.

Прямо сейчас, я нахожусь в середине сортировки актуальной проблемы в сборке .NET, которая привела меня на эту страницу. Тогда, я посмотрю, что я смогу собрать вместе; этот вызов стоит прямо над моей аллеей, и кто-то бросил перчатку.

Ответ 4

Да, есть функция, которая это делает, но я не помню, что это такое. В то же время вы можете использовать инструмент поиска ошибок (Tools- > Error Lookup), чтобы узнать, что означает определенный код из Visual Studio.