Я пытаюсь записать событие в журнал событий Windows. Все отлично работает, за исключением одного: я не могу получить данные о событии для отображения в журнале событий при записи события в него.
Вот копия моего манифеста:
<?xml version="1.0"?>
<instrumentationManifest xsi:schemaLocation="http://schemas.microsoft.com/win/2004/08/events eventman.xsd" xmlns="http://schemas.microsoft.com/ win/2004/08/events" xmlns:win="http://manifests.microsoft.com/win/2004/08/windows/events" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:trace="http://schemas.microsoft.com/win/2004/08/events/trace">
<instrumentation>
<events>
<provider
name="OperationFilter"guid="{B7FB08C2-AB1B-448F-BFE0-FB09BEF3659D}"symbol="OPERATION_FILTER"resourceFileName="C:\Program Files\TestBindParameters\TestBindParameters.exe"messageFileName="C:\Program Files\TestBindParameters\TestBindParameters.exe">
<events>
<event
symbol="OPERATION_DB_ERROR"value="1"version="0"channel="Operation-Filter-Admin"level="win:Error"message="$(string.OperationFilter.event.1.message)"template="Operation-Filter-Messages"></event>
</events>
<levels></levels>
<channels>
<channel
name="Operation-Filter-Admin"chid="Operation-Filter-Admin"symbol="OPERATION_FILTER_ADMIN"type="Admin"enabled="true"></channel>
</channels>
<templates>
<template tid="Operation-Filter-Messages">
<data name="ErrorMessage" inType="win:UnicodeString"></data>
</template>
</templates>
</provider>
</events>
</instrumentation>
<localization>
<resources culture="en-US">
<stringTable>
<string id="level.Error" value="Error"></string>
<string id="OperationFilter.event.1.message" value="There was an error interacting with the database during an operation."></string>
</stringTable>
</resources>
</localization>
</instrumentationManifest>
и вот функция, которая отвечает за запись в журнал событий:
DWORD writeToEventLog(LPWSTR message)
{
DWORD status = ERROR_SUCCESS;
REGHANDLE RegistrationHandle = NULL;
EVENT_DATA_DESCRIPTOR Descriptors[1];
status = EventRegister(
&OPERATION_FILTER,
NULL,
NULL,
&RegistrationHandle
);
std::wcout << L"message: " << message << std::endl;
if (status != ERROR_SUCCESS)
{
return status;
}
EventDataDescCreate(
&Descriptors[0],
message, //<----this won't show up even though I add it here
sizeof(wchar_t) * (wcslen(message) + 1)
);
status = EventWrite(
RegistrationHandle,
&OPERATION_DB_ERROR,
1,
&Descriptors[0]
);
if (status != ERROR_SUCCESS)
{
std::wcout << L"Unable to write to event log" << std::endl;
}
EventUnregister(RegistrationHandle);
return status;
}
Я добавил комментарий к данным о событии, которые хотел бы сохранить. Каждый раз, когда я вызываю вышеуказанный метод, я фактически получаю событие, записанное в журнал Windows, но с пустыми данными события. Строка сообщения, которая передается в функцию, не отображается под данными события, когда я просматриваю эти события в журнале событий Windows. Что мне здесь не хватает?
Я сослался на следующий пример онлайн нашел Вот. Я просто упускаю что-то совершенно очевидное?
Поэтому я ответил на свой вопрос здесь. Я забыл на самом деле скопировать мой файл в соответствующее место. Если вы собираетесь это сделать, вы ДОЛЖНЫ быть уверены, что правильно скопировали файл в местоположения resourceFileName и messageFileName. В противном случае вы получите неожиданное поведение от средства просмотра событий.
Других решений пока нет …