我在哪里可以找到ReportEvent函数用法的一个很好的例子?

时间:2009-08-17 22:14:26

标签: winapi advapi32

与大多数“遗留”MSDN网页一样,ReportEvent的网页信息太少,让我无法理解它。我试过搜索,但找不到一个好的,干净的,简单的函数用法示例。有人可以推荐一个吗?

4 个答案:

答案 0 :(得分:4)

我最终使用了这个:

HANDLE eventLog;
WORD type;
const char* msg;

// ... snip ...

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

似乎运作良好。

答案 1 :(得分:4)

嗯,这似乎是一个非常古老的主题,在这里寻找报告事件的一个很好的例子......但是想通了你没有收到任何回复......并且可能已经找到了解决方案。

您看到“未找到事件ID”的原因是因为EventViewer无法加载/查找要为事件ID显示的文本资源。对不起,如果最后一行听起来很怪......但这就是我对EventLog的理解:

-EventLogging有两个方面

  1. 注册EventLog(或其他术语创建EventSource)
  2. 记录或写入事件日志
  3. 查看或阅读日志
  4. 在事件日志中注册时,只需指定eventSource(标识该日志的任何名称)+ EventMessageFile,Category File和SupportedEventTypes。这里EventMessageFile指向包含您的消息描述/资源的DLL / EXE。

    当您记录事件时,只需使用EventID,Category ID和EventData等数据进行记录即可。但是当您使用任何EventViewer(或Windows eventVwr.exe)查看它时,查看器会读取您的事件,查找与您的eventSource关联的DLL / EXE(由EventMessageFile指向),并从该DLL / EXE的资源部分呈现解密

    这个DLL只不过是一个使用MessageCompiler编译的简单资源文件,它包含一个“MessageTable”。这样做是为了提供特定于文化的事件记录

    这就是为什么当您从EventViewer将日志导出到XML / TXT等时,它会询问您是否要“使用显示信息”或“不显示信息”将其保存,以便您可以在没有EventMessageFile的计算机。

    JFYI注册条目位于:

    HKLM\CurrentControlSet\System\Services\EventLog\Application
    

    一个问题:如果你想知道.Net是如何做到的......,只需提供一个名为EventLogMessage.dll的默认EventMessageFile(在%SYSTEMROOT%\Microsoft.Net\Framework\vXXXX\下找到)

答案 2 :(得分:1)

我记得设置正确是一件痛苦的事 - 你需要使用Message Compiler向你的应用程序添加消息 - 如果你跳过这个,你将看不到有用的消息只有错误代码。请查看Creating a Windows NT Service by Using ATL示例

答案 3 :(得分:0)

Windows Service 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);
    }
}