据我所知,ReportEvent函数需要Message Text Files通过注册表关联才能接收格式正确的消息。是否有任何常见的事件ID或任何简单的方法来报告没有关联消息文本文件的事件?
或者可能是,我可以在我的应用程序中使用特殊的常见事件源吗?像RegisterEventSource(NULL,“Application”)之类的东西?
答案 0 :(得分:2)
不,您只需遵循规则并定义您的消息文本文件,将它们构建到资源中,将它们链接到您的应用程序等。
example provided at MSDN引导您完成所有需要做的事情。
答案 1 :(得分:1)
试试这个,它之前对我有用..
答案 2 :(得分:0)
您没有在HKLM注册您的邮件。 (这是一件好事,因为如果您不是管理员,可以注册邮件)。
但这并不能阻止您将事件写入Windows应用程序事件日志。唯一的缺点是,从Windows Vista开始,你只会得到一些丑陋的文字。
HRESULT LogToEventLog(String Source, String EventText, int EventType, DWORD EventID)
{
/*
EventType is one of:
EVENTLOG_ERROR_TYPE = $0001;
EVENTLOG_WARNING_TYPE = $0002;
EVENTLOG_INFORMATION_TYPE = $0004;
EVENTLOG_AUDIT_SUCCESS = $0008;
EVENTLOG_AUDIT_FAILURE = $0010;
Source is your name for your app or feature, e.g.:
"My Cool App"
"Outlook"
"ESENT"
"Chrome"
*/
HANDLE h = RegisterEventSource(null, Source); //null --> local computer
if (h == 0)
return HResultFromWin32(GetLastError);
try
{
PChar[1] ss;
ss[0] = PChar(EventText);
if (!ReportEvent(
h, // event log handle
EventType, // event type
0, // category zero
EventID, // event identifier
null, // no user security identifier
1, // one substitution string
0, // no data
@ss, // pointer to string array
null // pointer to data
))
{
return HResultFromWin32(GetLastError);
}
}
finally
{
DeregisterEventSource(h);
}
return S_OK;
}
现在您可以将事件记录到应用程序事件日志中:
LogToEventLog("Stackoverflow", "Question 5399066 was answered by Ian Boyd",
EVENTLOG_INFORMATION_TYPE, 0x45);
不幸的是,从Windows Vista开始,Windows会提出一些丑陋的抱怨,表示您事先没有注册该事件:
来自源Stackoverflow的事件ID 69的描述不能 找到。未安装引发此事件的组件 您的本地计算机或安装已损坏。你可以安装 或修复本地计算机上的组件。
如果事件源自另一台计算机,则显示信息 不得不与事件一起得救。
活动中包含以下信息:
问题5399066由Ian Boyd回答
但你不能 与之共存。仅仅因为您没有在HKLM中注册消息源文件,并不意味着没有其他人这样做。
请注意,例如,事件日志中来自 Outlook 来源的消息:
Outlook
0x40000020
D:\win32app\Exchange\Outlook2003.pst
The store D:\win32app\Exchange\Outlook2003.pst has detected a catalog checkpoint.
您可以在中查看 Outlook 的注册信息:
HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \服务\事件日志\应用程序\观
见:
MessageEventFile: REG_SZ = "D:\Programs\MICROS~4\Office14\1033\MAPIR.DLL"
如果你查看MAPIR.dll二进制文件的资源,你会看到它的消息表:
1 MESSAGETABLE
{
0x12, "Connection stats for server (%1). Rpcs Attempted (%2), Rpcs Succeeded (%3), Rpcs Failed (%4), Rpcs Canceled (%5), Rpc UI shown (%6), Avg request time (%7) ms, Min request time (%8) ms, Max request time (%9) ms.\r\n"
0x14, "Cancelable RPC started.\r\n"
0x15, "Cancelable RPC shutdown.\r\n"
0x40000010, "Cancelable RPC dialog shown for server (%1), total wait time was (%2) ms, result was (%3).\r\n"
0x40000011, "User canceled request against server (%1) after waiting (%2) ms.\r\n"
0x40000013, "Rpc call (%1) on transport (%2) to server (%3) failed with error code (%4) after waiting (%5) ms; eeInfo (%6).\r\n"
0x40000016, "There was a problem reading one or more of your reminders. Some reminders may not appear.\r\n"
0x40000017, "Unable to update public free/busy data.\r\n"
0x4000001A, "%1\r\n"
0x4000001B, "%1\r\n"
0x4000001D, "The store %1 is being re-pushed to the indexer for the following reason: %2.\r\n"
0x4000001E, "Starting reconciliation for the store %1 for the following reason: %2.\r\n"
0x4000001F, "The store %1 has detected a catalog rebuild.\r\n"
0x40000020, "The store %1 has detected a catalog checkpoint.\r\n"
...
}
您可以看到eventid 0x40000020与格式化字符串相关联:
"商店%1检测到目录检查点。\ r \ n"
您可以劫持Outlook的注册:
LogToEventLog("Outlook", "Your mom", EVENTLOG_INFORMATION_TYPE, $40000020);
并且您将事件添加到事件日志中,而不会发出任何丑陋的警告: