繁体   English   中英

WinAPI ReportEvent-未安​​装组件

[英]WinAPI ReportEvent - component not installed

我实现了一个简单的功能,可以从应用程序登录事件查看器。 但是,无论错误级别如何,每次登录时都会收到以下消息:

找不到源MyAppEvents中事件ID 0的描述。 引发此事件的组件未安装在本地计算机上,或者安装已损坏。 您可以在本地计算机上安装或修复组件。

如果事件起源于另一台计算机,则显示信息必须与事件一起保存。

我不是事件日志的专家,实际上,这是我第一次在C ++中使用它,并且文档令人困惑和误导...

这是我实现的用于封装事件日志调用的方法:

HANDLE source = NULL;

void app_log(std::string m, WORD level) {
    std::wstring msg_temp (m.begin(), m.end());
    LPCWSTR msg = msg_temp.c_str();

    std::wstring name(L"MyAppEvents");
    if (source == NULL) 
        source = RegisterEventSource(NULL, name.c_str());
    if (source) {
        if (!ReportEvent(source, level, 0, 0, NULL, 1, 0, &msg, NULL))
            std::cerr << "Error when logging";
    }
    else 
        std::cerr << "Error when logging";
}

我有一个使用WIX构建的应用程序安装程序(此安装程序创建登录事件查看器所需的密钥-Application的子项),并且运行顺利。 但是,我不明白该消息,也不知道如何将已安装的应用程序附加到事件日志中-我什至不确定这是否是问题所在,或者它可能不是我的参数之一传递为NULL0

我调试时也会显示此消息(无需安装,但手动创建了“应用程序子项”)。

你可以帮帮我吗?

我不能使用C ++托管代码...

您的日志记录代码没有任何问题。 该警告消息仅表示您没有在注册表中正确注册MyAppEvents事件源。 这记录在MSDN上:

RegisterEventSource函数

pSourceName [输入]
要获取其句柄的事件源的名称。 源名称必须是Eventlog注册表项下的日志的子项 请注意,安全日志仅供系统使用。

事件来源

事件源的结构如下:

\n HKEY_LOCAL_MACHINE\n    系统\n       CurrentControlSet\n          服务\n             事件日志\n                应用\n                   应用名称\n                安全\n                系统\n                   驱动名称\n                自定义日志\n                   应用名称\n

...

每个事件源均包含特定于将记录事件的软件的信息(例如消息文件

...

应用程序可以使用应用程序日志,而无需向注册表添加新的事件源。 如果应用程序调用RegisterEventSource并传递在注册表中找不到的源名称,则事件记录服务默认情况下使用应用程序日志。 但是,因为没有消息文件,所以事件查看器无法将任何事件标识符或事件类别映射到描述字符串,并且将显示错误 因此,您应该为应用程序的注册表添加唯一的事件源,并指定一个消息文件。

仅创建MyAppEvents子项是不够的,您还必须将其指向应用程序的消息文件。 如果将事件日志类别和事件消息存储为应用程序可执行文件的资源,则子项可以将可执行文件本身注册为消息文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM