WinAPI ReportEvent - 未安装组件

时间:2016-05-24 14:48:37

标签: c++ windows winapi event-viewer

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

  

找不到源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构建(此安装程序创建登录事件查看器所需的密钥 - 应用程序的子项),并且运行顺畅。但是,我没有理解这条消息,也不知道如何将我安装的应用程序附加到事件日志中 - 我实际上甚至不确定这是否是问题,或者是否是也许我作为NULL0传递的参数之一。

此消息在我调试时也会出现(不安装,但使用&#34;应用程序子项&#34;手动创建)。

你能帮帮我吗?

我无法使用C ++托管代码......

1 个答案:

答案 0 :(得分:4)

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

RegisterEventSource function

  

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

Event Sources

  

事件来源的结构如下:

HKEY_LOCAL_MACHINE
   SYSTEM
      CurrentControlSet
         Services
            EventLog
               Application
                  AppName
               Security
               System
                  DriverName
               CustomLog
                  AppName
     

...

     

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

     

...

     

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

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