/* * エラーメッセージ表示 * * ==== 著作権表示はじめ ==== * Copyright (c) 1998 Yutani Miki. * All rights reserved. * * このコードの著作権は著作者に存在しますが、著作者は以下に列挙した * 事項以外には一切の権利義務を積極的には主張しないことを宣言します。 * (1) このコードを利用したことによるいかなる金銭的および非金銭的な * 損害についても著作者はその責任を負いません。このコードの * 一部または全部の利用は、当該利用者の責任において行ってください。 * (2) このコードの一部または全部を利用または再配布する際には、 * すべての利用者がこの記述 ("==== 著作権表示はじめ ===="の行より * "==== 著作権表示おわり ===="の行まで) を参照できる形式に * してください。 * ==== 著作権表示おわり ==== * * 確認した環境: * Platform: * Windows NT Workstation 4.0 SP3 (Japanese) * Visual C++ 5.0 (English) * Compile: * cl -nologo -W3 -D__STDC__ -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl * -D_X86_ -DWIN32 -D_WIN32 -D_WINNT -D_WINNT32_WINNT=0x400 * -D_WIN95 -D_WIN32_WINDOWS=0x0400 -DJAPAN -DDBCS -DFE_IME * -DWINVER=0x0400 -GX -MD -Z7 -Od -DNDEBUG -D_CONSOLE -D_MBCS * -TC -c -Fo./ErrMsg.obj ./ErrMsg.c * Link: * link -nologo -nodefaultlib -machine:IX86 * -debug -debugtype:coff -pdb:none -map -subsystem:console,4.0 * -out:./ErrMsg.exe * ./ErrMsg.obj * msvcrt.lib msvcprt.lib msvcirt.lib * kernel32.lib advapi32.lib user32.lib gdi32.lib * comdlg32.lib winspool.lib */ #include #include /* * 引数で渡されたメッセージを標準出力に書き出します。 * コントロールコードは "^A" の形式に変換します。 */ void PrintMessage(LPCTSTR msg, DWORD errorno) { int i; fprintf(stdout, "%10ld [%08lx]: ", errorno, errorno); for (i = 0; i < lstrlen(msg); i++) { if (msg[i] > '\0' && msg[i] < ' ') { fputc('^', stdout); fputc(msg[i] + '@', stdout); } else { fputc(msg[i], stdout); } } fputc('\n', stdout); } /* * 引数で渡されたエラー番号を日本語のエラーメッセージ文字列に変換して * 標準出力に書き出します。 */ BOOL PrintError(DWORD errorno) { TCHAR *msg; /* * FormatMessageA API を呼び出して errorno に対応する * エラーメッセージを取得します。メッセージは * FormatMessageA API の内部で確保されますので、 * 使用後には LocalFree API を呼び出して解放しなければなりません。 * * FormatMessageA API の 4 番目の引数は使用する言語を示しています。 * この例ではユーザのデフォルトの言語を用いるように指定しています。 * SUBLANG_DEFAULT を SUBLANG_SYS_DEFAULT に変更すると * システムのデフォルトの言語になります。 * また、Windows NTの日本語版の場合、次の定数を指定すると * 英語のメッセージに変更することができます。 * MAKELCID(MAKELANGID(LANG_ENGLISH, * SUBLANG_ENGLISH_US), * SORT_DEFAULT), */ if (!FormatMessageA((FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM), NULL, errorno, MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), SORT_DEFAULT), (char *)&msg, 0, NULL)) { return FALSE; } /* * 最後の改行コードを削除して表示します。 */ PrintMessage(msg, errorno); /* * FormatMessageA API の確保した領域を解放します。 */ LocalFree(msg); return TRUE; } /* * メインルーチン * * Usage: ErrMsg.exe [Error-Number].. * 各パラメタをエラー番号とみなし、 * 順番にエラーメッセージ文字列に変換して表示します。f * * Example: * C:\>ErrMsg.exe 0 5 * 0 [00000000]: 操作は正常終了しました。^M^J * 5 [00000005]: アクセスが拒否されました。^M^J */ int main(int argc, char** argv) { int i; if (argc < 2) { fputs("usage: ErrMsg number..\n", stderr); return 1; } for (i = 1; i < argc; i++) { if (!PrintError((DWORD)atoi(argv[i]))) { fprintf(stderr, "Failed. (%ld)\n", GetLastError()); } } return 0; }