【问题标题】:WinAPI ReportEvent - component not installedWinAPI ReportEvent - 未安装组件
【发布时间】:2016-05-24 14:48:36
【问题描述】:

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

找不到来自源 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 构建的应用程序安装程序(此安装程序创建登录事件查看器所需的密钥 - 应用程序的子项)并且它运行顺利。但是,我不明白那条消息,也不知道如何将我安装的应用程序附加到事件日志中——我实际上什至不确定这是否是问题所在,或者它是否可能是我的参数之一'm pass as NULL or 0.

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

你能帮帮我吗?

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

【问题讨论】:

    标签: c++ windows winapi event-viewer


    【解决方案1】:

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

    RegisterEventSource function:

    pSourceName [in]
    要检索其句柄的event source 的名称。 源名称必须是 Eventlog 注册表项下日志的子项。请注意,安全日志仅供系统使用。

    Event Sources:

    事件源的结构如下:

    HKEY_LOCAL_MACHINE 系统 当前控制集 服务 事件簿 应用 应用名称 安全 系统 司机姓名 自定义日志 应用名称

    ...

    每个事件源都包含特定于将记录事件的软件的信息(例如 message file

    ...

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

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

    【讨论】:

    • 好的,我已经有了密钥 HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Services EventLog Application MyAppEvents。它们被记录在 EventViewer 上的应用程序和服务日志下的部分中。但是,我没有创建任何消息文件 - 我只记录包含堆栈跟踪和我的应用程序在运行时可能发现的错误信息的字符串。 Í 相信这就是该消息的原因...
    • 您需要为您的事件源提供一个消息文件。 ReportEvent() 具有您设置为 0 的 wCategorydwEventID 参数,并且错误消息抱怨无法找到事件 ID 0 的消息文本,因为您还没有定义一个。在我的应用程序中,我将事件 ID 0 定义为简单的 "%1",因此传递给 ReportEvent() 的文本按原样记录,但不再显示额外的错误消息。
    猜你喜欢
    • 2023-02-17
    • 2015-10-16
    • 2018-03-06
    • 2015-07-07
    • 1970-01-01
    • 2016-06-14
    • 2018-11-12
    • 2011-06-13
    • 1970-01-01
    相关资源
    最近更新 更多