Испускать сигнал от статической функции

Я хочу испустить сигнал, когда wlan соединение было зарегистрировано со статики notificationCallBack функция.

Код:

WirelessConnect.h

static void WINAPI notificationCallBack(PWLAN_NOTIFICATION_DATA wlanData, PVOID context);

WirelessConnect.cpp

DWORD dwResult = 0;
dwResult = WlanRegisterNotification(hClient, WLAN_NOTIFICATION_SOURCE_ALL, TRUE, notificationCallBack, NULL, NULL, &dwPrevNotif);

void WINAPI WirelessConnect::notificationCallBack(PWLAN_NOTIFICATION_DATA wlanData, PVOID context)
{
context = NULL;
switch (wlanData->NotificationCode) {
case wlan_notification_acm_connection_complete:
emit apConnectionComplete();
qDebug() << "Connected!";
break;

case wlan_notification_acm_connection_attempt_fail:
emit apConnectionFailed();
qDebug() << "Failed!";
break;

default:
break;
}
}

Test .cpp:

WirelessConnect *wirelessAPConnect = new WirelessConnect();
connect(wirelessAPConnect, &WirelessConnect::apConnectionComplete, setAPConnection);
connect(wirelessAPConnect, &WirelessConnect::apConnectionFailed, setAPConnectionFailed);

Проблема в error: C2355: 'this': can only be referenced inside non-static member functions or non-static data member initializers,

Так как излучать сигнал от static функция, например, для отображения QMessageBox о связи WLAN в Test учебный класс?

Решения по ссылке выше не работают:

1 метод: notificationCallBack(PWLAN_NOTIFICATION_DATA wlanData, PVOID context) функция требует только 2 параметра PWLAN_NOTIFICATION_DATA wlanData а также PVOID context а не ссылка на класс в качестве параметра

2 метод: привести к ошибке: C3867: 'WirelessConnect::apConnectionComplete': non-standard syntax; use '&' to create a pointer to member в соединении:
connect(wirelessAPConnect, WirelessConnect::apConnectionComplete, this, &Test::setAPConnection);

Я исправил ошибки компиляции с помощью метода 2, но он ничего не генерирует.

Код:

WirelessConnect.cpp

static WirelessConnect wirelessConnectObj;

void WINAPI WirelessConnect::notificationCallBack(PWLAN_NOTIFICATION_DATA wlanData, PVOID context)
{
context = NULL;
switch (wlanData->NotificationCode) {
case wlan_notification_acm_connection_complete:
wirelessConnectObj.apConnectionComplete();
qDebug() << "Connected!";
break;

case wlan_notification_acm_connection_attempt_fail:
wirelessConnectObj.apConnectionFailed();
qDebug() << "Failed!";
break;

default:
break;
}
}

dwResult = WlanRegisterNotification(hClient, WLAN_NOTIFICATION_SOURCE_ALL, TRUE, notificationCallBack, NULL, NULL, &dwPrevNotif);

test.cpp

WirelessConnect *wirelessAPConnect = new WirelessConnect();
connect(wirelessAPConnect, &WirelessConnect::apConnectionComplete, this, &Test::setAPConnection);
connect(wirelessAPConnect, &WirelessConnect::apConnectionFailed, this, &Test::setAPConnectionFailed);

Нет ошибок компиляции и setAPConnection не выполняется

Я думаю static WirelessConnect wirelessConnectObj; NULL и ничего не выполняет. Когда я использую статический WirelessConnect * wirelessConnectObj; в качестве указателя после подключения приложения к точке доступа, после чего происходит сбой приложения.

Когда инициализировать static WirelessConnect *wirelessConnectObj = new WirelessConnect(); приложение работает, но нет выполнения сигнала / слота.

Отредактировано:

WirelessConnect класс управляет и другим не статичным wlan функции, которые связаны с сигналами и слотами. Так что я не могу удалить wirelessAPConnect объект и использовать только статический объект. Я инициализировал static WirelessConnect wirelessConnectObj; в Test также и подключите его:

connect(&wirelessConnectObj, &WirelessConnect::apConnectionComplete, this, &Test::setAPConnection);
connect(&wirelessConnectObj, &WirelessConnect::apConnectionFailed, this, &Test::setAPConnectionFailed);

Выход такой же — ничего. Я думаю, это потому, что я создал 2 разных статических экземпляра WirelessConnect учебный класс. Мне нужно иметь только один статический экземпляр WirelessConnect который должен быть глобальным для отправки сигнала и подключения их в Test,

1

Решение

Я исправил проблему:

Я поставил this к функции:

WlanRegisterNotification(hClient, WLAN_NOTIFICATION_SOURCE_ALL, TRUE, notificationCallBack, this, NULL, &dwPrevNotif);

void WINAPI WirelessConnect::notificationCallBack(PWLAN_NOTIFICATION_DATA wlanData, PVOID context)
{
WirelessConnect *pThis = (WirelessConnect*) context;
switch (wlanData->NotificationCode) {
case wlan_notification_acm_connection_complete:
pThis->apConnectionComplete();
qDebug() << "Connected!";
break;

case wlan_notification_acm_connection_attempt_fail:
pThis->apConnectionFailed();
qDebug() << "Failed!";
break;

default:
break;
}
}

Затем подключите его как не статический экземпляр:

connect(wirelessAPConnect, &WirelessConnect::apConnectionComplete, this, &Test::setAPConnection);
connect(wirelessAPConnect, &WirelessConnect::apConnectionFailed, this, &Test::setAPConnectionFailed);

Поэтому мне больше не нужен статический глобальный экземпляр, и теперь он работает.

Отредактировано:

После некоторой диагностики (подключение / отключение от точек доступа) решение привело к сбою приложения.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]