Подключение dll к проекту Qt5

295
12 января 2017, 05:35

Мне необходимо использовать функционал Windows Event Log. Для доступа к функция данного API нужно добавить dll к проекту. Я добавил в .pro файл следующее:

LIBS += -lws2_32 \
        c:/windows/System32/wevtapi.dll \
        c:/Windows/System32/kernel32.dll \

После чего на всякий случай добавил wevtapi.h и #pragma comment(lib, "Wevtapi.lib")везде где необходимо.

Но MinGW в упор не видит функций и типов:

EvtOpenChannelEnum
EvtNextChannelPath
PEVT_VARIANT

Выдаёт ошибку

'EvtOpenChannelEnum' was not declared in this scope hChannels = EvtOpenChannelEnum(NULL, 0);

Что я делаю не так?

код:

#include <QCoreApplication>
#include <windows.h>
#include <sddl.h>
#include <stdio.h>
#include <winevt.h>
#include <QCoreApplication>
#include <winsock2.h>
#include <windows.h>
#include <sddl.h>
#include <stdio.h>
#include <winevt.h>
#include <iostream>
#include <string>
#include <vector>
#pragma comment(lib, "Wevtapi.lib")

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    EVT_HANDLE hChannels = NULL;
    hChannels = EvtOpenChannelEnum(NULL, 0);
    return a.exec();
}

.pro

QT += core
QT -= gui
LIBS += -lws2_32 \
        c:/windows/System32/wevtapi.dll \
        c:/Windows/System32/kernel32.dll \
        c:/Windows/System32/shlwapi.dll
LIBS += -lws2_32 -lkernel32 -lwevtapi -lshlwapi

CONFIG += c++11
TARGET = untitled7
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
Answer 1

Необходимые Вам функции и типы объявлены в заголовочном файле winevt.h. Однако, они "обёрнуты" в #if (_WIN32_WINNT >= 0x0600). Значение 0x0600 означает, что они доступны только на Windows Vista и выше. Поэтому необходимо перед всеми включаемыми файлами определить константу _WIN32_WINNT. Тогда код примет следующий вид:

#define _WIN32_WINNT 0x0600
#include <QCoreApplication>
#include <windows.h>
#include <winevt.h>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    EVT_HANDLE hChannels = NULL;
    hChannels = EvtOpenChannelEnum(NULL, 0);
    return a.exec();
}

Впрочем, можно не "засорять" исходные тексты такими определениями и добавить в .pro-файл следующую строку:

DEFINES += _WIN32_WINNT=0x0600

Далее, требуемые функции реализованы в динамической библиотеке (DLL) wevtapi, поэтому нужно явно указать компоновщику на необходимость её использования, добавив в тот же .pro-файл следующее:

LIBS += -lwevtapi

Теперь компоновщик при сборке .exe-файла проекта будет использовать также файл libwevtapi.a, в котором сказано, что функции находятся в библиотеке wevtapi.dll. Тем самым компоновщик добавит информацию о необходимости подключения этой библиотеки к исполняемому файлу.

READ ALSO
Проверка существования объекта

Проверка существования объекта

Вот что подставить там где знаки вопроса?

276
назначения адреса функции в IDA PRO

назначения адреса функции в IDA PRO

есть ли возможность назначить адрес функции в IDA PRO? имеется такая функция

302
Запрос с 4-х уровневой выборкой

Запрос с 4-х уровневой выборкой

Есть 4 таблицы связанные между собой по id иерархически юзеры->телефоны->сайты->налог и есть входящий массив данных в котором присутствует...

287