方法: "Event Message Not Found" メッセージのトラブルシューティング


概要


イベント ビューアのイベントに次のエラー メッセージが表示される場合、いくつかの理由が考えられます。
ソース (<application name>) 内のイベント ID (<####>) に関する説明が見つかりませんでした。 次の挿入文字列が含まれています : <the text of the message logged by ReportEvent>
この資料では、この問題のトラブルシューティングについて説明します。

詳細情報


以下に、考えられる原因と、問題を修正する方法の詳細を記載します。 1 つまたは複数の要因が原因となって、問題が生じることがあります。


  1. 正しくないソース名のパラメータが RegisterEventSource に渡されました。


    レジストリのソース名が、RegisterEventSource に渡されたソース名と一致していることを確認します。 この機能は、レジストリでソースが見つからない場合でも実行されます。 レジストリのソース名は次のサブキーにあります。


    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog
    一般的に、アプリケーション ソースはアプリケーションのサブキーの下に一覧されています。
  2. レジストリ内の .dll ファイルまたは .exe ファイルへのパスが正しくありません。 次の場所にある EventMessageFile というレジストリ値を探します。


    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\
    Services\EventLog\Application\sourcename
    ここで、.dll ファイルまたは .exe ファイルへのパスが正しく、これらのファイルの名前が正しいことを確認します。 名前やパスが正しくないと、イベント ビューア アプリケーションはメッセージ リソースのソースのロードに失敗します。 また、%SystemRoot% またはほかのマクロを使用している場合は、REG_EXPAND_SZ というレジストリ値のタイプを使用する必要があります。 そうでないと、マクロは展開されません。
  3. 登録されたメッセージのソースが間違った .dll ファイルまたは .exe ファイルになっています。 次の場所にある EventMessageFile というレジストリ値を探します。

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\
    Services\EventLog\Application\sourcename
    ここで、.dll ファイルまたは .exe ファイルへのパスが、予想されるメッセージ リソースを含むパスであることを確認します。 パスが指定されておらず、同名のファイルが複数ある EventMessageFile があるかどうか、確認してください。 イベント ビューアは、LoadLibrary API のコメントに記載された検索アルゴリズムを使用して、ルールに従ってメッセージ ソースを検索します。


    Windows NT 4.0 の場合、システムへの KnownDLL として DLL 名がレジストリに一覧されているかどうかに注意してください。これは、リビルドされた DLL は再起動するまで使用されないためです。 このトピックの詳細については、WinNT と KnownDLL をキーワードとして 「サポート技術情報」 (Microsoft Knowledge Base) を検索してください。
  4. メッセージのリソースが EventMessageFile ソースにバインドされていません。

    あるバージョンのログ サンプルではメイクファイルのビルドの一部として .rc ファイルをインクルードしていません。 その結果、DLL はビルドされますが、メッセージ リソースはビルドに含まれません。 メッセージ コンパイラから出力された .bin ファイルをリソースとしてインクルードすることを試みた開発者もいるようです。 このようにしても DLL へのリソースは正しくバインドされません。 メッセージ コンパイラは、ID 1 とタイプ 11 (RT_MESSAGETABLE) でリソースをマークするため、メッセージ コンパイラから出力された .rc ファイルを使用する必要があります。 これは、イベント ビューアがメッセージ リソースを検索するために必要です。

    EventMessageFile DLL のビルドに Visual C++ を使用している場合、Visual C++ プロジェクトのソース ファイルとして、メッセージ コンパイラにより出力された .rc ファイルを追加してください。 これにより、.rc ファイルをコンパイルし、DLL へのリソースをリンクすることが Visual C++ に命令されます。
  5. ReportEvent 関数に、正しい ID が渡されることを確認します。


    .mc ファイルに格納されているリテラルの ID 番号が正しい ID だと思われることが多いようです。 これは誤りです。その理由は、メッセージ コンパイラはビットごとの OR 演算によって ID 番号を LOWORD に、重要度と機能のビットを HIWORD に、格納するためです。 アプリケーションは常にメッセージ コンパイラから出力されたヘッダー ファイルのシンボリック名を使用します。


    .mc ファイルの MessageIdTypedef= ステートメントを確認します。 いくつかのサンプル .mc ファイルでは、MessageIDTypedef をカテゴリ ID として WORD 型に定義する方法を示しています。 しかし、これは、イベント ID が HIWORD 部分のデータを失う原因となります。 この問題を修正するには、MessageIdTypedef= の定義を 1 つに限定し、DWORD 型に設定します。


    また、MC -c コマンド ラインをメッセージ リソースとヘッダー ファイルに対して矛盾なく使用するようにしてください。 -c スイッチはメッセージ ID の HIWORD にあるビットを有効にします。
  6. レジストリに EventMessageFile エントリを追加してから、イベント ビューアを再起動していません。


    イベント ビューアはロードした DLL をキャッシュし、イベント ソースを生成します。 イベント ビューアを起動した後で、適切なディレクトリまたはソース名を指すようにレジストリを変更した場合はイベント ビューアを再起動する必要があります。