【问题标题】:Emit signal from static function issue从静态函数问题发出信号
【发布时间】:2018-02-27 00:44:05
【问题描述】:

我想在静态notificationCallBack 函数注册wlan 连接时发出信号。

代码:

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;
    }
}

测试.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关于Test类中的wlan连接?

上面链接中的解决方案不起作用:

1 方法:notificationCallBack(PWLAN_NOTIFICATION_DATA wlanData, PVOID context) 函数只需要 2 个参数 PWLAN_NOTIFICATION_DATA wlanDataPVOID context,而不是对类的引用作为参数

2 方法:导致错误:C3867: 'WirelessConnect::apConnectionComplete': non-standard syntax; use '&amp;' to create a pointer to member 在连接中: connect(wirelessAPConnect, WirelessConnect::apConnectionComplete, this, &amp;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 对象而只使用静态对象。我也在Test 中初始化了static WirelessConnect wirelessConnectObj; 并连接它:

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

输出是一样的——什么都没有。我认为,这是因为我创建了 WirelessConnect 类的 2 个不同的静态实例。我只需要一个WirelessConnect 的静态实例,它应该是全局的,可以发送信号并将它们连接到Test

【问题讨论】:

  • @Mat 如果它是重复的,那么请指定链接,以便我可以阅读它,否则打​​开我的问题。
  • 链接位于页面顶部,在您的问题标题下方。 (您可能需要刷新页面。)如果不提供至少一个链接,则无法关闭为重复。
  • @Mat 我不认为这是一样的,解决方案在我的情况下不起作用。
  • 然后edit 你的问题显示你如何在链接的问题中应用这两种解决方案以及它如何仍然不起作用。
  • WirelessConnect 在您的连接调用和信号发射中必须相同。

标签: c++ qt wifi wlanapi


【解决方案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);

所以我不再需要静态全局实例,它现在可以工作了。

已编辑:

经过一些诊断(从接入点连接/断开连接)后,解决方案导致应用程序崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2011-10-03
    • 2013-01-31
    相关资源
    最近更新 更多