WinAPI ReportEvent - компонент не установлен

Я реализовал простую функцию для входа в программу просмотра событий из моего приложения. Тем не менее, я получаю следующее сообщение каждый раз, когда что-то регистрирую, независимо от уровня ошибки:

Описание для события с идентификатором 0 из источника MyAppEvents не может быть найдено. Либо компонент, который вызывает это событие, не установлен на локальном компьютере, либо установка повреждена. Вы можете установить или восстановить компонент на локальном компьютере.

Если событие возникло на другом компьютере, отображаемая информация должна была быть сохранена вместе с событием.

Я не специалист по журналу событий, на самом деле, я впервые использую его в 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 (этот установщик создает ключ, необходимый для входа в систему просмотра событий - подраздел приложения), и он работает без сбоев. Тем не менее, я не понял это сообщение, а также не знаю, как прикрепить мое установленное приложение к журналу событий - на самом деле я даже не уверен, является ли это проблемой, или это один из параметров, которые я проезжаю как NULL или же 0,

Это сообщение появляется также при отладке (без установки, но с созданным вручную "подразделом приложения").

Не могли бы вы помочь мне?

Я не могу использовать C++ управляемый код...

1 ответ

Решение

Там нет ничего плохого с вашим кодом регистрации. Предупреждающее сообщение просто означает, что вы неправильно зарегистрировали MyAppEvents источник события в реестре. Это задокументировано в MSDN:

Функция RegisterEventSource:

pSourceName [in]
Имя источника события, чей дескриптор должен быть получен. Имя источника должно быть подразделом журнала в разделе реестра Eventlog. Обратите внимание, что журнал безопасности предназначен только для системного использования.

Источники событий:

Структура источников событий следующая:

HKEY_LOCAL_MACHINE
   СИСТЕМА
      CurrentControlSet
         Сервисы
            Журнал событий
               заявка
                  Имя приложения
               Безопасность
               система
                  DriverName
               CustomLog
                  Имя приложения

...

Каждый источник событий содержит информацию (например, файл сообщений), относящуюся к программному обеспечению, которое будет регистрировать события

...

Приложение может использовать журнал приложений, не добавляя новый источник событий в реестр. Если приложение вызывает RegisterEventSource и передает имя источника, которое невозможно найти в реестре, служба регистрации событий по умолчанию использует журнал приложений. Однако из-за отсутствия файлов сообщений программа просмотра событий не может сопоставить какие-либо идентификаторы событий или категории событий со строкой описания и отображает ошибку. По этой причине вам следует добавить в реестр уникальный источник событий для вашего приложения и указать файл сообщений.

Недостаточно просто создать MyAppEvents подраздел, вы также должны указать его на файлы сообщений для вашего приложения. Если вы храните категории журнала событий и сообщения о событиях в качестве ресурсов исполняемого файла приложения, подключ может зарегистрировать сам исполняемый файл в качестве файлов сообщений.

Другие вопросы по тегам