我在哪里可以找到ReportEvent功能使用的一个很好的例子?(Where can I find

2019-08-01 12:14发布

与大多数“传统” MSDN页面,该页面ReportEvent有太少的信息,我做的是什么意义。 我试图寻找,但无法找到一个好的,干净,简单函数的用法的例子。 任何人都可以提出一个?

Answer 1:

最后我用这个:

HANDLE eventLog;
WORD type;
const char* msg;

// ... snip ...

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

似乎工作不够好。



Answer 2:

嗯,这似乎是一个很老的线程,降落在这里寻找报告事件的一个很好的例子...但想通了,你还没有收到任何答复......而且会对可能已经找到了解决办法。

你看“事件ID找不到”的原因是因为在事件查看器无法加载/查找文本资源要显示的事件ID。 很抱歉,如果最后一行听起来古怪..但是这就是我理解的事件日志:

-EventLogging有两个方面

  1. 与事件日志(或在其他方面创造的EventSource)注册
  2. 登录或写入到事件日志
  3. 查看或日志阅读

当您在事件日志中注册,你只需指定一个EventSource的+ EventMessageFile,分类文件和SupportedEventTypes(标识该日志的任何名称)。 这里EventMessageFile指向DLL / EXE包含您的信息描述/资源。

当你登录一个事件,你只需用喜欢的EventID,类别ID和EVENTDATA一些数据记录它。 但是,当您查看使用它的任何事件查看器(或Windows EVENTVWR.EXE)观众读您的活动,寻找与你的EventSource(由EventMessageFile指出)相关的DLL / EXE,并从该DLL / EXE的资源部分呈现能解密。

此DLL是什么,但认为使用MessageCompiler编一个简单的资源文件,并包含一个“消息表”。 这样做是为了提供特定的文化事件记录

就是这个原因,当您将日志导出到XML / TXT等从你的事件查看器,它会询问您是否想“以显示咨询无论”或“不显示信息”省省吧,这样你可以在做电脑上查看没有EventMessageFile。

JFYI了reg入口位于:

HKLM\CurrentControlSet\System\Services\EventLog\Application

一个陷阱:如果你想知道的.Net是怎么做的......,它只是提供了一个默认的EventMessageFile称为EventLogMessage.dll做它(下找到%SYSTEMROOT%\Microsoft.Net\Framework\vXXXX\



Answer 3:

我记得这是一个痛苦的正确设置-你需要的信息添加到使用你的应用程序消息编译器 -如果你跳过这个你不会看到有用的信息只有错误代码。 看看创建Windows NT服务通过使用ATL为例



Answer 4:

样本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);
    }
}


文章来源: Where can I find a good example of ReportEvent function usage?