私はp/invokeを使用していくつかのWindows関数をいじっています。ときどき、ERROR_SUCCESSではないエラーコード(奇妙な名前など)が表示されます。
プログラム内でこれらを調べる方法はありますか?たとえば、エラー1017が発生した場合。ユーザーに通知できますか
システムがファイルをレジストリにロードまたは復元しようとしましたが、指定されたファイルはレジストリファイル形式ではありません。 (ERROR_NOT_REGISTRY_FILE:0x3F9)
の代わりに
エラーコード:1017
気の利いた.NETラッパーがあるかどうかはわかりませんが、P/Invokeを使用してFormatMessage APIを呼び出すことができます。
通常、ネイティブコードから呼び出される方法については、 この回答 を参照してください。質問はHRESULTからエラーコードを取得することについて言及していますが、回答はGetLastError/GetLastWin32Errorからの通常のOSエラーコードからコードを取得する場合にも適用されます。
編集:代替の管理されたAPIを含むpinvoke.netを私に指摘してくれたMalfistに感謝します:
using System.ComponentModel;
string errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message;
Console.WriteLine(errorMessage);
Rensselaer Polytechnic Institute の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);
P/Invokeを介してFormatMessageを呼び出す代わりの管理された方法を探しているときに、このページにアクセスしました。
他の人が言ったように、これらの大文字のアンダースコア付きの名前を取得する方法はありません。特定のステータスの解決に関する情報を検索する過程で上陸したさまざまな場所でオンラインで再現されたwinerror.hでそれらを検索することはできません。コード。 Rensselaer Polytechnic Instutute で、winerror.h自体をGoogleですばやく検索したところ、ページが見つかりました。
それを見るとアイデアが浮かびました。 Microsoft Visual Studioのすべての最新バージョンに同梱されているWindowsプラットフォームSDKの一部として、私が持っているwinerror.hのソースコードから作業する方法があると思います。
現在、このページに移動した.NETアセンブリの差し迫った問題を整理している最中です。次に、一緒に何ができるかを見ていきます。この種の挑戦は私の路地のすぐ上にあり、誰かがガントレットを投げました。