Получение названия/описания кода ошибки системы 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.