7

ほとんどの「レガシー」MSDNページと同様に、ReportEventのページには情報が少なすぎて、理解できません。検索してみましたが、関数の使用法の良い、きれいな、簡単な例を見つけることができません。誰かが提案できますか?

4

4 に答える 4

4

私はこれを使用することになりました:

HANDLE eventLog;
WORD type;
const char* msg;

// ... snip ...

ReportEvent(eventLog, type, 0, 1, NULL, 1, 0, &LPCTSTR(msg), NULL);

十分に機能しているようです。

于 2009-08-23T14:08:59.683 に答える
4

さて、これは非常に古いスレッドのようで、レポートイベントの良い例を探してここに着陸しました...しかし、あなたは何の返信も受け取っていないことがわかりました...そしておそらくすでに解決策を見つけているでしょう。

「イベントIDが見つかりません」と表示される理由は、EventViewerがイベントIDに表示されるテキストリソースをロード/ルックアップできないためです。最後の行がオタクに聞こえたら申し訳ありませんが、これは私がEventLogについて理解していることです:

-EventLoggingには2つの側面があります

  1. EventLogに登録する(または他の用語でEventSourceを作成する)
  2. イベントログへのログ記録または書き込み
  3. ログの表示または読み取り

イベントログに登録するときは、eventSource(そのログを識別する任意の名前)+ EventMessageFile、Category File、およびSupportedEventTypesを指定するだけです。ここで、EventMessageFileは、メッセージの説明/リソースを含むDLL/EXEを指します。

イベントをログに記録するときは、EventID、カテゴリID、EventDataなどのデータを使用してログに記録するだけです。ただし、EventViewer(またはWindows eventVwr.exe)を使用して表示すると、ビューアはイベントを読み取り、eventSource(EventMessageFileが指す)に関連付けられたDLL / EXEを探し、そのDLL/EXEのリソースセクションからの説明をレンダリングします。 。

このDLLは、MessageCompilerを使用してコンパイルされた単純なリソースファイルであり、「MessageTable」が含まれています。これは、カルチャ固有のイベントログを提供するために行われます

これが理由です。イベントビューアからXML/TXTなどにログをエクスポートすると、「表示情報あり」または「表示情報なし」のどちらでログを保存するかを尋ねられます。これにより、ログを表示するコンピュータで表示できます。 EventMessageFileがありません。

JFYIregエントリは次の場所にあります。

HKLM\CurrentControlSet\System\Services\EventLog\Application

1つのキャッチ:.Netがどのようにそれを行うのか疑問に思っている場合は、EventLogMessage.dll(の下にある%SYSTEMROOT%\Microsoft.Net\Framework\vXXXX\)と呼ばれるデフォルトのEventMessageFileを提供することによってそれを行うだけです。

于 2012-08-22T11:58:51.723 に答える
1

正しく設定するのは面倒です。メッセージコンパイラを使用してアプリケーションにメッセージを追加する必要があります。これをスキップすると、有用なメッセージは表示されず、エラーコードのみが表示されます。例として、ATLを使用したWindowsNTサービスの作成をご覧ください。

于 2009-08-17T23:18:27.550 に答える
0

サンプルのWindowsサービスC++は、イベントログに報告するWindowsサービスであり、https://code.msdn.microsoft.com/windowsapps/CppWindowsService-cacf4948からコードを取得できます 。特に、次の関数(ServiceBase.cppから引用) )それを行います

//
//   FUNCTION: CServiceBase::WriteEventLogEntry(PWSTR, WORD)
//
//   PURPOSE: Log a message to the Application event log.
//
//   PARAMETERS:
//   * pszMessage - string message to be logged.
//   * wType - the type of event to be logged. The parameter can be one of 
//     the following values.
//
//     EVENTLOG_SUCCESS
//     EVENTLOG_AUDIT_FAILURE
//     EVENTLOG_AUDIT_SUCCESS
//     EVENTLOG_ERROR_TYPE
//     EVENTLOG_INFORMATION_TYPE
//     EVENTLOG_WARNING_TYPE
//
void CServiceBase::WriteEventLogEntry(PWSTR pszMessage, WORD wType)
{
    HANDLE hEventSource = NULL;
    LPCWSTR lpszStrings[2] = { NULL, NULL };

    hEventSource = RegisterEventSource(NULL, m_name);
    if (hEventSource)
    {
        lpszStrings[0] = m_name;
        lpszStrings[1] = pszMessage;

        ReportEvent(hEventSource,  // Event log handle
            wType,                 // Event type
            0,                     // Event category
            0,                     // Event identifier
            NULL,                  // No security identifier
            2,                     // Size of lpszStrings array
            0,                     // No binary data
            lpszStrings,           // Array of strings
            NULL                   // No binary data
            );

        DeregisterEventSource(hEventSource);
    }
}
于 2016-09-07T17:06:45.433 に答える