Что бы не возникала ошибка : | Цитата | | это подключение было прервано | попробуйте сделать так:
Для соединения с провайдером используйте функцию
| Код | function RasMakeDialupConnection(const EntryName: string): Boolean; var dwRet: Dword; DialParams: TRasDialParams; hRas: HRASCONN; bPwd: Boolean; // was the password retrieved begin uLastErr := 0; // Prepare dial parameters FillChar(DialParams, SizeOf(DialParams), 0); DialParams.dwSize := SizeOf(DialParams); StrPLCopy(@(DialParams.szEntryName[0]), EntryName, SizeOf(DialParams.szEntryName)); hRas := 0; // must do that before calling RasDial // Try to retrieve user name/passowrd. // We continue even if RasGetEntryDialParams returns error, because // in next call RasDial will just try with empty user name/password bPwd := False; RasGetEntryDialParams(nil, @DialParams, bPwd); // Call RAS API. In this particular case RasDial will not return until // the connections is established or failed to establish. dwRet := RasDial(nil, nil, // no dial extensions, default phonebook @DialParams, 0, // ignored here nil, // do not use callback - the call is synch hRas); // receives connection handle Result := dwRet = 0; // Connection failed... if not Result then begin // In some cases hRas may be non-zero and the connection port // is still opened. It is a Windows semi-bug/semi-feature. // So I must try to close if hRas <> 0 then RasHangupConnection(hRas); // RasHangup may reset uLastErr, but we need the value // returned from RasDial uLastErr := dwRet; end; end; | или | Код | function DialProvider(connection: string): boolean; // connection - имя учетной записи var pars: TRasDialParams; hRas: ThrasConn; r: integer; begin hRas := 0; strpcopy(pars.szEntryName, connection); // имя учетной записи pars.szPhoneNumber := ''; // номеp телефона - по умолчанию pars.szcallbacknumber := ''; // callback нам не нужен pars.szUserName := ''; // логин - по умолчанию pars.szPassWord := ''; // паpоль - по умолчанию pars.szDomain := ''; // аналогично с домейном pars.dwSize := Sizeof(TRasDialParams); // вычисляем pазмеp записи r := rasdial(nil, nil, pars, 0, nil, hRas); // звоним if r <> 0 then begin // если что-то неполучилось, то rasHangUp(hRas); // сбpасываем соединение result := false; // ф-ция тепеpь веpнет false end else result := true; // а если все ок - то true. end; |
Разрывать соединение функцией | Код | type TRasConn = record Size: DWORD; Handle: THandle; Name: array[0..20] of AnsiChar; end;
TRasEnumConnections = function(var RasConn: TRasConn; var Size: DWORD; var Connections: DWORD): DWORD stdcall; TRasHangUp = function(Handle: THandle): DWORD stdcall;
function DisconnectDialUp: Boolean; var Lib: HINST; RasEnumConnections: TRasEnumConnections; RasHangUp: TRasHangUp; RasConn: TRasConn; Code, Size, Connections: DWORD; begin Result := True; try Lib := LoadLibrary('rasapi32.dll'); try if Lib = 0 then Abort; RasEnumConnections := GetProcAddress(Lib, 'RasEnumConnectionsA'); if not Assigned(@RasEnumConnections) then Abort; RasHangUp := GetProcAddress(Lib, 'RasHangUpA'); if not Assigned(@RasHangUp) then Abort; FillChar(RasConn, SizeOf(RasConn), 0); RasConn.Size := SizeOf(RasConn); Code := RasEnumConnections(RasConn, Size, Connections); if (Connections <> 1) or (Code <> 0) then Abort; if RasHangUp(RasConn.Handle) <> 0 then Abort; Sleep(3000); finally FreeLibrary(Lib); end; except on E: EAbort do Result := False; else raise; end; end; |
использовать ее можно так: | Код | if DisconnectDialUp then // что-то, если соединение разорвали else // если не разорвали (у меня такого еще не было!) |
|