Функции EventLog возвращают ERROR_INVALID_PARAMETER - PullRequest
0 голосов
/ 14 января 2020

При попытке прочитать и получить количество событий в журнале событий я получаю сообщение об ошибке 87.

#include <windows.h>
#include <stdio.h>
#include <strsafe.h>
#define PROVIDER_NAME "System"

void wmain(void)
{
    HANDLE hEventLog = NULL;
    DWORD status = ERROR_SUCCESS;
    PDWORD numEvents = 0;

    hEventLog = OpenEventLog(NULL, PROVIDER_NAME);
    printf("Last error: %lu\n", GetLastError());
    if (!GetNumberOfEventLogRecords(hEventLog, numEvents))
    {
        printf("Failed GetNumberOfEventLogRecords: %lu\n", GetLastError());

    }

Вывод:

Last error: 0
Failed GetNumberOfEventLogRecords: 87

Я пробовал с несколькими варианты для PROVIDER_NAME, и я основал свой пример на этом, сделайте c, но как только я сделаю какую-либо настройку, как в моем примере, я сталкиваюсь с ERROR_INVALID_PARAMETER

https://docs.microsoft.com/en-us/windows/win32/eventlog/querying-for-event-source-messages

Я не уверен, на что ссылается неправильный параметр.

Ответы [ 2 ]

1 голос
/ 14 января 2020

В документации GetNumberOfEventLogRecords() :

NumberOfRecords

Указатель на переменную , которая получает количество записей в указанный журнал событий.

Ваша переменная numEvents является указателем PDWORD (DWORD*) со значением 0. Таким образом, вы вызываете GetNumberOfEventLogRecords() с указателем NULL в своем NumberOfRecords параметр. Вот на что жалуется ошибка ERROR_INVALID_PARAMETER - ей некуда записывать количество записей.

Вам нужно передать адрес действительной переменной DWORD, а не указатель NULL.

Кроме того, вы не должны звонить GetLastError() после OpenEventLog(), если только это не произойдет.

Попробуйте:

#include <windows.h>
#include <stdio.h>
#include <strsafe.h>
#define PROVIDER_NAME "System"

void wmain(void)
{
    HANDLE hEventLog = NULL;
    DWORD numEvents = 0;
    ...

    hEventLog = OpenEventLog(NULL, PROVIDER_NAME);
    if (!hEventLog) {
        printf("Failed OpenEventLog: %lu\n", GetLastError());
    }
    else {
        if (!GetNumberOfEventLogRecords(hEventLog, &numEvents)) {
            printf("Failed GetNumberOfEventLogRecords: %lu\n", GetLastError());
        }
        else {
            ...
        }
        CloseEventLog(hEventLog);
    }
}
1 голос
/ 14 января 2020

NumberOfRecords

Указатель на переменную, которая получает количество записей в указанном журнале событий.

Вам необходимо передать адрес значения DWORD, чтобы получить номер

#include <windows.h>
#include <stdio.h>
#include <strsafe.h>
#define PROVIDER_NAME "System"

int wmain(void)
{
    HANDLE hEventLog = NULL;
    DWORD status = ERROR_SUCCESS;
    DWORD numEvents = 0;

    hEventLog = OpenEventLog(NULL, PROVIDER_NAME);
    printf("Last error: %lu\n", GetLastError());
    if (!GetNumberOfEventLogRecords(hEventLog, &numEvents))
    {
        printf("Failed GetNumberOfEventLogRecords: %lu\n", GetLastError());

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...