Получение системы Windows ошибка код название/описание от его шестнадцатиричное число
Я путаюсь с некоторыми функциями windows, используя p / invoke. Иногда я получаю код ошибки, который не является ERROR_SUCCESS (такое странное имя).
Есть ли способ посмотреть их в программе? Например, если я получу ошибку 1017. Могу ли я сказать пользователю
Система попыталась загрузить или
восстановить файл в реестре, но
указанный файл не находится в
формат файла реестра.
(ERROR_NOT_REGISTRY_FILE: 0x3F9)
Вместо
Код Ошибки: 1017
4 ответов:
Я не уверен, что существует оболочка niifty .NET, но вы можете вызвать API FormatMessage с помощью P / Invoke.
СмотритеЭтот ответ для того, как он обычно вызывается из собственного кода. Хотя вопрос относится к захвату кодов ошибок из HRESULTs, ответ также применим для восстановления кодов из обычных кодов ошибок ОС, поступающих из GetLastError/GetLastWin32Error).
EDIT: спасибо Malfist за то, что указал мне на pinvoke.net, которая включает в себя альтернативные, управляемые API:
using System.ComponentModel; string errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message; Console.WriteLine(errorMessage);
Вы можете взять определения из winerror.h в политехническом институте Ренсселера , и поместить их в перечисление:
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);
Я приземлился на этой странице в поисках управляемой альтернативы вызову FormatMessage через P/Invoke.
Как говорили другие, нет никакого способа получить эти заглавные, подчеркнутые имена, кроме поиска их в winerror.h, который я видел воспроизведенным в интернете в различных местах, где я приземлился в ходе поиска информации о разрешении конкретных кодов состояния. Быстрый поиск в Google, для winerror.h, сам, раскрыл страницу, в Rensselaer Polytechnic Instutute , где кто-то услужливо извлек из него операторы #define.
Глядя на него, я получил идею; я думаю, что может быть способ добраться туда, работая с исходным кодом winerror.h, который у меня есть, как часть пакета SDK платформы Windows, который поставляется с каждой последней версией Microsoft Visual Studio.
Прямо сейчас я нахожусь в середине разбора насущной проблемы в сборке .NET, которая привела меня на эту страницу. А потом я посмотрю, что смогу сделать.; этот вид вызова прямо по моей части, и кто-то бросил перчатку.
Да, есть функция, которая делает это, но я не помню, что это такое. В то же время вы можете использовать средство поиска ошибок (Tools->Error Lookup), чтобы узнать, что означает конкретный код в Visual Studio.
Comments