与大多数“传统” 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有两个方面
- 与事件日志(或在其他方面创造的EventSource)注册
- 登录或写入到事件日志
- 查看或日志阅读
当您在事件日志中注册,你只需指定一个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);
}
}