与大多数“遗留”MSDN网页一样,ReportEvent的网页信息太少,让我无法理解它。我试过搜索,但找不到一个好的,干净的,简单的函数用法示例。有人可以推荐一个吗?
答案 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有两个方面
在事件日志中注册时,只需指定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);
}
}