Windows API 内で FormatMessage 関数を使用して、システム エラー コードからメッセージ文字列を生成しています。一部のエラー コードでは、完全なメッセージが作成されていないように見えることに気付きました。
例として、次のサンプル プログラムを取り上げます。
int main()
{
wchar_t * buffer = nullptr;
FormatMessageW(
FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_IGNORE_INSERTS,
nullptr,
ERROR_SYSTEM_PROCESS_TERMINATED,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
reinterpret_cast<LPWSTR>(&buffer),
0,
nullptr);
std::wcout << buffer << std::endl;
return 0;
}
MSDNによると、次のように表示されます。
{致命的なシステム エラー}
%hs システム プロセスは、ステータス 0x%08x (0x%08x 0x%08x) で予期せず終了しました。システムがシャットダウンされました。
ただし、サンプル プログラムでは次のように表示されます。
{致命的なシステム エラー}
%hs システム プロセスは、ステータス 0x で予期せず終了しました
ERROR_UNHANDLED_EXCEPTION
完全なメッセージも作成されないことに気付きました (MSDN のリストと比較した場合)。予想される両方のメッセージには0x%08プレースホルダーが含まれていますが、メッセージは0xの後で終了します。
私が見る限り、他のエラー メッセージは MSDN のリストと一致しているようです (つまり、問題は と に限定されているようERROR_UNHANDLED_EXCEPTION
ですERROR_SYSTEM_PROCESS_TERMINATED
)。
engf-010 の功績 - Visual Studio でエラー ルックアップ ツール ([ツール] - [エラー ルックアップ]) を使用すると、同じ結果が得られます。エラー コードは 574 と 591 です。
これらのメッセージが切り取られている理由を誰か知っていますか?
とにかく完全なメッセージを取得する方法はありますか?