Я хочу испустить сигнал, когда 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
,
Я исправил проблему:
Я поставил 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);
Поэтому мне больше не нужен статический глобальный экземпляр, и теперь он работает.
Отредактировано:
После некоторой диагностики (подключение / отключение от точек доступа) решение привело к сбою приложения.
Других решений пока нет …