Лучший отвечающий
C++ Получить информацию из Windows Event Log

Вопрос
-
Здравствуйте!
Имеется Windows 2008 R2 с ролью печати. К нему подключены принтеры и пользователи печатают через него. В Windows Event Log "Администрирование -> Просмотр событий" заносятся записи, при печати : имя пользователя, принтер, время печати. Как получит это сообщение в C++?
Пробую:
#include "windows.h" #include "winbase.h" #include <iostream> #include <ctime> int main(int argc, char *argv[]) { HANDLE h; EVENTLOGRECORD *pevlr; BYTE bBuffer[16384]; DWORD dwRead, dwNeeded, cRecords, dwThisRecord; h = OpenEventLog( 0, L"Application"); if (h == NULL) std::cout << "Error open EventLog\n"; pevlr = (EVENTLOGRECORD *) &bBuffer; GetOldestEventLogRecord(h, &dwThisRecord); time_t myt; while (ReadEventLog(h, EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ, 0, pevlr, 16384, &dwRead, &dwNeeded)) { while (dwRead > 0) { myt = pevlr->TimeGenerated; std::cout << ctime(&myt); // !!! Вот тут не хватает мозгов, чтобы из pevlr достать содержимое события. dwRead -= pevlr->Length; pevlr = (EVENTLOGRECORD *) ((LPBYTE) pevlr + pevlr->Length); } pevlr = (EVENTLOGRECORD *) &bBuffer; } }
Скажите пожалуйста, как правильно получить содержимое этого сообщения в string или в массив char?16 октября 2013 г. 7:43
Ответы
-
Строки, сопровождающие события, можно получить, например, так:
LPTSTR pstr = (LPTSTR)((LPBYTE)pevlr + pevlr->StringOffset); for (WORD i = 0; i < pevlr->NumStrings; i++) { std::wstring message = pstr; std::wcout << message << std::endl; pstr += message.length() + 1; }
wstring и wcout здесь используются потому, что у Вас строки, возвращаемые ReadEventLog в кодировке UNICODE. Если нужны ANSI-строки, установите в свойствах проекта значение параметра "Набор символов" в "Не задано".
- Предложено в качестве ответа kosuke904 16 октября 2013 г. 13:31
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 21 октября 2013 г. 8:34
16 октября 2013 г. 13:30 -
Вот здесь большой пример получения информации из журнала событий Windows.
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 21 октября 2013 г. 8:35
16 октября 2013 г. 13:41
Все ответы
-
Добрый день.
А если воспользоваться FormatDescription?
16 октября 2013 г. 8:23Отвечающий -
Строки, сопровождающие события, можно получить, например, так:
LPTSTR pstr = (LPTSTR)((LPBYTE)pevlr + pevlr->StringOffset); for (WORD i = 0; i < pevlr->NumStrings; i++) { std::wstring message = pstr; std::wcout << message << std::endl; pstr += message.length() + 1; }
wstring и wcout здесь используются потому, что у Вас строки, возвращаемые ReadEventLog в кодировке UNICODE. Если нужны ANSI-строки, установите в свойствах проекта значение параметра "Набор символов" в "Не задано".
- Предложено в качестве ответа kosuke904 16 октября 2013 г. 13:31
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 21 октября 2013 г. 8:34
16 октября 2013 г. 13:30 -
Вот здесь большой пример получения информации из журнала событий Windows.
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 21 октября 2013 г. 8:35
16 октября 2013 г. 13:41 -
Неуправляемый код, однако :)16 октября 2013 г. 20:31