Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

RasDial (rasapi) и чудеса работы функции

444
17 мая 2011 года
patison
323 / / 15.03.2007
Необходимо создать программными средствами VPN подключение и подключиться через него к серваку (всё это из приложения).
Пишу под windows xp (виртуальный, на самой тачке стоит ubuntu).
Программа на Qt/C++ . Использую родную виндовую rasapi32.dll.
Выгружаю необходимые функции из длл-ки след образом:
 
Код:
QLibrary lib("rasapi32");
typedef DWORD (APIENTRY *Proc_Dial) (LPRASDIALEXTENSIONS, LPCSTR, LPRASDIALPARAMSA, DWORD, LPVOID, LPHRASCONN);
ras_Dial = (Proc_Dial)lib.resolve("RasDialA");
...

Далее код создания подключения, который никакого интереса для нас в данный момент не представляет.
И потом самое интересное - функция установки соединения:
Код:
LPRASDIALPARAMSA lpDialParams;
    lpDialParams = new RASDIALPARAMSA[ sizeof(RASDIALPARAMSA) ];
    lpDialParams->dwSize = sizeof(RASDIALPARAMSA);
    strcpy(lpDialParams->szEntryName, sConnName.toAscii());
    strcpy(lpDialParams->szUserName, "login");
    strcpy(lpDialParams->szPassword, "pass");

    HRASCONN hRasConn;

    dwErr = ras_Dial(NULL, NULL, lpDialParams, NULL, NULL, &hRasConn);
    delete lpDialParams;
    qDebug() << "Err RasDial: "  << dwErr;

Результат работы функции - почти всегда ошибка 668 . Причём иногда функция начинает работать, после изменений ну НИКАК не касающихся работы самой функции. Т.е. например я комментировал строку qDebug() << "Err RasDial: " << dwErr; , после чего функция самым что ни на есть таинственным образом начинала работать (т.е. устанавливалось соединение с vpn сервером).
Я почти уверен что делаю что-то не правильно, однако часы поисков ответов почти ни к чему не привели. Может кто подскажет где зарыта собака?
14
18 мая 2011 года
Phodopus
3.3K / / 19.06.2008
Есть идея, но нужен нерабочий кусок оформленный полным Qt проектом. Т.к. мало времени перепечатывать...
444
18 мая 2011 года
patison
323 / / 15.03.2007
Спасибо, но только вот решил проблему своими силами :))
Открыл сетевые подключения, ткнул в подключение что-бы подключиться, и обратил внимание что он как-то не сразу подключается, а как будто несколько раз пытается. И тут вспомнил о какой-то статье, в которой говорилось что для подключения - нужен цикл. Т.к. с первого раза может не получиться. В итоге вот что получилось:
 
Код:
dwRes = this->Connect(sUsername, sPassword);
        while( dwRes == ERROR_NO_CONNECTION )
        {
            ras_HangUp(this->hConnectionHandle);
            dwRes = this->Connect(sUsername, sPassword);
        }

Уже завернул весь функционал в методы класса. Но думаю из этого куска кода суть ясна )
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог