1

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 です。


これらのメッセージが切り取られている理由を誰か知っていますか?

とにかく完全なメッセージを取得する方法はありますか?

4

1 に答える 1

2

言及したメッセージ (ERROR_UNHANDLED_EXCEPTIONおよびERROR_SYSTEM_PROCESS_TERMINATED) には、printf スタイルの挿入 ( %08x) があります。ただし、FormatMessage は %0 を使用してメッセージを終了します。

私の推測では、これらのメッセージがシステムによって返され、printf スタイルのプレースホルダーが既に設定されている別の方法があると思います。これらのメッセージは、未加工の形式で、FormatMessage によって処理されることを意図していません。

これらのメッセージにテキスト(Fatal System Error)またはが含まれていることを考えると(Application Error)、Windows がこれらのメッセージを特別に処理することはまったく驚くべきことではありません。

于 2016-06-03T12:07:25.757 に答える