Russian Qt Forum
Января 18, 2025, 16:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Реализация RasCallBack функции...???  (Прочитано 8898 раз)
zoro86
Гость
« : Июня 15, 2010, 15:08 »

Значит есть некий код с использованием RasApi для устаноления удаленного соединения...
Код:
qint32 MainWindow::connectGPRS(QString connectionName)
{
    RASDIALPARAMS RDP;
    HRASCONN HRC = NULL;

    RDP.dwSize=sizeof(RDP);
    wcscpy(RDP.szEntryName,(const wchar_t*)connectionName.utf16());
    int Pass;
    int res=RasGetEntryDialParams(NULL,&RDP,&Pass);
    if (res!=ERROR_SUCCESS)
    {
        return -1;
    }
    else
    {

        RDP.dwSize=sizeof(RDP);
        qDebug()<<QString("connectGPRS: user: %1").arg(QString::fromUtf16((ushort*)((RDP.szUserName))));

        res=RasDial(0,0,&RDP,0,[color=red]&slot_GPRS_timer()[/color],&HRC);
        if (res!=ERROR_SUCCESS)
        {
            qDebug()<<QString("Error RasDial: %1").arg(res);
            RasHangUp( HRC );

            return -1;
        }
        else
        {
            qDebug()<<QString("RasDial: OK%1").arg((qint32)(HRC));

            return 1;
        }
    }

    return 1;
}

там где отмечено красным шрифтом, у меня при компиляции говорит
Код:
: error: lvalue required as unary '&' operand
надо реализовать так называемый RasCallBack-функцию которая должна мне выдавать ход подключения например( Установка связи с beeline..., Проверка имени и пароля пользователя...)

есть ссылка на инфу где на Делфи реализована... http://forum.sources.ru/index.php?showtopic=30572#04 до меня туга доходит... помогите плизз...
Записан
zenden
Гость
« Ответ #1 : Июня 15, 2010, 15:34 »

пишите &slot_GPRS_timer без круглых скобочек
Кстати , функция, указатель на которую вы передаете должна быть либо глобальной, либо статической
Записан
zoro86
Гость
« Ответ #2 : Июня 15, 2010, 15:41 »

Код:
public slots:
  void slot_GPRS_timer();
________________________________________________________________

Код:
res=RasDial(0,0,&RDP,0,&slot_GPRS_timer,&HRC);

что не получается ... :(при компиляции выдает...


modules\classes\mainwindow.cpp:180: error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say '&MainWindow::slot_GPRS_timer'
modules\classes\mainwindow.cpp:180: error: cannot convert 'void (MainWindow::*)()' to 'void*' for argument '5' to 'DWORD RasDialW(tagRASDIALEXTENSIONS*, const WCHAR*, tagRASDIALPARAMSW*, DWORD, void*, HRASCONN__**)'
Записан
BRE
Гость
« Ответ #3 : Июня 15, 2010, 16:01 »

Убери ее из секции slots.
Код
C++ (Qt)
static void slot_GPRS_timer();
 
Записан
zoro86
Гость
« Ответ #4 : Июня 17, 2010, 07:14 »


modules\classes\mainwindow.cpp:180: error: invalid conversion from 'void (*)()' to 'void*'
modules\classes\mainwindow.cpp:180: error: initializing argument 5 of 'DWORD RasDialW(tagRASDIALEXTENSIONS*, const WCHAR*, tagRASDIALPARAMSW*, DWORD, void*, HRASCONN__**)'

 Непонимающий
Записан
BRE
Гость
« Ответ #5 : Июня 17, 2010, 08:28 »

Код
C++ (Qt)
class MainWindow : ...
{
static void slot_GPRS_timer();
 
...
 
res=RasDial( 0, 0, &RDP, 0, &MainWindow::slot_GPRS_timer, &HRC );
 
Записан
zoro86
Гость
« Ответ #6 : Июня 17, 2010, 09:05 »

так тоже ошибку выдает...


error: cannot convert 'void (MainWindow::*)()' to 'void*' for argument '5' to 'DWORD RasDialW(tagRASDIALEXTENSIONS*, const WCHAR*, tagRASDIALPARAMSW*, DWORD, void*, HRASCONN__**)'


Я тут сюда зашел...
http://bcbjournal.org/articles/vol3/9903/Using_RAS__part_1.htm?PHPSESSID=38ce55d5b68379366f93e5b6e6f7ed65

он делает следующее...
Код:
void WINAPI MainWindow::RasCallback(HRASCONN hrasconn,
        UINT unMsg, RASCONNSTATE rascs,
        DWORD dwError, DWORD dwExtendedError)
{
        QString S = "";
        if (dwError) {
                // Error occurred, show the error string.
                wchar_t buff[256];

                RasGetErrorString(
                        dwError, buff, sizeof(buff));

                return;
        }
        switch (rascs) {
                // Build a status string based on the
                // status message.
                case RASCS_PortOpened :
                        S = "Port opened..."; break;
                case RASCS_DeviceConnected :
                        S = "Connected..."; break;
                case RASCS_Authenticate :
                        S = "Logging on..."; break;
                case RASCS_Authenticated :
                        S = "Authenticated"; break;
                case RASCS_Connected :
                        S = "Logon Complete";
                        break;

                case RASCS_Disconnected :
                        S = "Disconnected"; break;
        }
        qDebug() << S;
     
}

а потом ...

Код:

делал static он говорит что должен быть без статика

DWORD res = RasDial(
0, 0, &params, 1, RasCallback, &hRas);


говорит..

error: cannot convert 'void (MainWindow::*)(HRASCONN__*, UINT, RASCONNSTATE, DWORD, DWORD)' to 'void*' for argument '5' to 'DWORD RasDialW(tagRASDIALEXTENSIONS*, const WCHAR*, tagRASDIALPARAMSW*, DWORD, void*, HRASCONN__**)'


как мне это дело декларировать у себя правильно... Непонимающий

Записан
Nimbus
Гость
« Ответ #7 : Июня 17, 2010, 09:38 »

Честно, не пользовался коллбэком в Qt ещё пока ни разу.
Вам же нужно передать указатель на функцию, не так ли? По-моему здесь не нужно использовать ни скобок, ни операции извлечения адреса, а лишь имя функции.
И да, лучше её убрать из слотов.
Можете создать указатель типа
void (*pslot_GPRS_timer)() = slot_GPRS_timer;
И уже pslot_GPRS_timer передать в функцию. Хотя, тут возможно понадобится ещё добавлять что-то типа _cdecl _stdcall
Записан
BRE
Гость
« Ответ #8 : Июня 17, 2010, 09:55 »

Покажи как декларирован RasDial.
Записан
zoro86
Гость
« Ответ #9 : Июня 17, 2010, 12:32 »

Код:
#ifdef Q_OS_WIN32
    #include "windows.h"
    #include "wingdi.h"
    #include "winuser.h"
    #include "psapi.h"
    #include "winsvc.h"
    #include "shellapi.h"
    #include "ras.h"
    #include "tchar.h"
    #include "raserror.h"
    #include "rasdlg.h"
    #include "winreg.h"
#else
#endif

.h

Код:
private:
            //
            qint32 connectGPRS(QString connectionName);
            qint32 disconnectGPRS();

public:
        void WINAPI RasCallback(HRASCONN hrasconn,
                                   UINT unMsg, RASCONNSTATE rascs,
                                   DWORD dwError, DWORD dwExtendedError);

.cpp

Код:
void WINAPI MainWindow::RasCallback(HRASCONN hrasconn,
        UINT unMsg, RASCONNSTATE rascs,
        DWORD dwError, DWORD dwExtendedError)
{
        QString S = "";
        if (dwError) {
                // Error occurred, show the error string.
                wchar_t buff[256];

                RasGetErrorString(
                        dwError, buff, sizeof(buff));

//                return ;
        }
        switch (rascs) {
                // Build a status string based on the
                // status message.
                case RASCS_PortOpened :
                        S = "Port opened..."; break;
                case RASCS_DeviceConnected :
                        S = "Connected..."; break;
                case RASCS_Authenticate :
                        S = "Logging on..."; break;
                case RASCS_Authenticated :
                        S = "Authenticated"; break;
                case RASCS_Connected :
                        S = "Logon Complete";
                        break;

                case RASCS_Disconnected :
                        S = "Disconnected"; break;
        }
        qDebug() << S;
        // Show the status message in the memo.
// if (S != "")
// Form1->Memo1->Lines->Add(S);
}


qint32 MainWindow::connectGPRS(QString connectionName)
{
    RASDIALPARAMS RDP;
    HRASCONN HRC = NULL;

    RDP.dwSize=sizeof(RDP);
    wcscpy(RDP.szEntryName,(const wchar_t*)connectionName.utf16());
    int Pass;
    int res=RasGetEntryDialParams(NULL,&RDP,&Pass);
    if (res!=ERROR_SUCCESS)
    {
        return -1;
    }
    else
    {

        RDP.dwSize=sizeof(RDP);
        qDebug()<<QString("connectGPRS: user: %1").arg(QString::fromUtf16((ushort*)((RDP.szUserName))));

        res=RasDial(0,0,&RDP,1,MainWindow::RasCallback,&HRC);
        if (res!=ERROR_SUCCESS)
        {
            qDebug()<<QString("Error RasDial: %1").arg(res);
            RasHangUp( HRC );

            return -1;
        }
        else
        {
            qDebug()<<QString("RasDial: OK%1").arg((qint32)(HRC));

            return 1;
        }
    }

    return 1;
}
Записан
zoro86
Гость
« Ответ #10 : Июня 17, 2010, 12:35 »

Вот сюда глянте пожалуйста... как в Билдере реализовано...
http://bcbjournal.org/articles/vol3/9903/Using_RAS__part_1.htm?PHPSESSID=38ce55d5b68379366f93e5b6e6f7ed65
Записан
BRE
Гость
« Ответ #11 : Июня 17, 2010, 14:46 »

RasDial ждет void*
Код
C++ (Qt)
class MainWindow : ...
{
static void RasCallback(HRASCONN hrasconn,
                                  UINT unMsg, RASCONNSTATE rascs,
                                  DWORD dwError, DWORD dwExtendedError);
 
...
 
res = RasDial( 0, 0, &RDP, 0, (void*)&MainWindow::RasCallback, &HRC );
 
Записан
zoro86
Гость
« Ответ #12 : Июня 17, 2010, 15:40 »

Когда делаю так...

в .cpp

Код:
static void MainWindow::RasCallback(HRASCONN hrasconn,
        UINT unMsg, RASCONNSTATE rascs,
        DWORD dwError, DWORD dwExtendedError)
{ .... }


компилятор говорит..

Код:
error: cannot declare member function 'static void MainWindow::RasCallback(HRASCONN__*, UINT, RASCONNSTATE, DWORD, DWORD)' to have static linkage

когда делаю так...

в .cpp

Код:
void MainWindow::RasCallback(HRASCONN hrasconn,
        UINT unMsg, RASCONNSTATE rascs,
        DWORD dwError, DWORD dwExtendedError)
{ .... }

при запуске прога отваливается... Непонимающий
Записан
BRE
Гость
« Ответ #13 : Июня 17, 2010, 15:50 »

В .cpp не нужно писать static!
Код
C++ (Qt)
void MainWindow::RasCallback(HRASCONN hrasconn,
       UINT unMsg, RASCONNSTATE rascs,
       DWORD dwError, DWORD dwExtendedError)
{ .... }
 


static нужно писать только в .h в описании класса.
Почитай что нибудь по C++.  Подмигивающий
Записан
zoro86
Гость
« Ответ #14 : Июня 17, 2010, 16:07 »

Вы правы за не имением кое каких понятий в с++ делаю методом тыка...

Ну я в начале так и сделал потом когда прога велетела я прописал static в .cpp... думал прокатит Смеющийся

ща вроде понял почему вылетает...

сделал следующее...

.h

Код:
static void WINAPI RasCallback(HRASCONN hrasconn,
                                   UINT unMsg, RASCONNSTATE rascs,
                                   DWORD dwError, DWORD dwExtendedError);

.cpp

Код:
void WINAPI MainWindow::RasCallback(HRASCONN hrasconn,
        UINT unMsg, RASCONNSTATE rascs,
        DWORD dwError, DWORD dwExtendedError)
{...}

res=RasDial(0,0,&RDP,1,(void*)MainWindow::RasCallback,&HRC);


ща заработала... прикольная штука...

все события выдает и как надо работает... Спасибо BRE
тема закрыта
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.156 секунд. Запросов: 20.