QLibrary lib("rasapi32");
typedef DWORD (APIENTRY *Proc_Dial) (LPRASDIALEXTENSIONS, LPCSTR, LPRASDIALPARAMSA, DWORD, LPVOID, LPHRASCONN);
ras_Dial = (Proc_Dial)lib.resolve("RasDialA");
...
RasDial (rasapi) и чудеса работы функции
Пишу под windows xp (виртуальный, на самой тачке стоит ubuntu).
Программа на Qt/C++ . Использую родную виндовую rasapi32.dll.
Выгружаю необходимые функции из длл-ки след образом:
Код:
Далее код создания подключения, который никакого интереса для нас в данный момент не представляет.
И потом самое интересное - функция установки соединения:
Код:
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;
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 сервером).
Я почти уверен что делаю что-то не правильно, однако часы поисков ответов почти ни к чему не привели. Может кто подскажет где зарыта собака?
Есть идея, но нужен нерабочий кусок оформленный полным Qt проектом. Т.к. мало времени перепечатывать...
Открыл сетевые подключения, ткнул в подключение что-бы подключиться, и обратил внимание что он как-то не сразу подключается, а как будто несколько раз пытается. И тут вспомнил о какой-то статье, в которой говорилось что для подключения - нужен цикл. Т.к. с первого раза может не получиться. В итоге вот что получилось:
Код:
dwRes = this->Connect(sUsername, sPassword);
while( dwRes == ERROR_NO_CONNECTION )
{
ras_HangUp(this->hConnectionHandle);
dwRes = this->Connect(sUsername, sPassword);
}
while( dwRes == ERROR_NO_CONNECTION )
{
ras_HangUp(this->hConnectionHandle);
dwRes = this->Connect(sUsername, sPassword);
}
Уже завернул весь функционал в методы класса. Но думаю из этого куска кода суть ясна )