Получение названия / описания кода системной ошибки Windows из его шестнадцатеричного числа - PullRequest
31 голосов
/ 30 октября 2009

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

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

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

Вместо

Код ошибки: 1017

Ответы [ 4 ]

93 голосов
/ 30 октября 2009

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

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

РЕДАКТИРОВАТЬ: Спасибо Malfist за указание на pinvoke.net, который включает в себя альтернативный, управляемый API:

using System.ComponentModel;

string errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message;
Console.WriteLine(errorMessage);
2 голосов
/ 10 декабря 2015

Вы можете взять определения из winerror.h в Политехнический институт Ренсселера и поместить их в 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);
0 голосов
/ 10 октября 2015

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

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

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

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

0 голосов
/ 30 октября 2009

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

...