| 
| 
 | Вопрос # 928/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты!Кто работал с RAS API скажите:
 Как с помощью RAS установить и разорвать удаленное соединение с интернетом? Если можно опишите поподробнее параметры. И как узнать установлено ли соединение.
 
|  |   Вопрос задал: Евгений Eklmn (статус: Посетитель)Вопрос отправлен: 17 сентября 2007, 15:41
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Feniks Здравствуйте, Трофимов Евгений!Выдержка из статьи "Подключиться к Интернету, определить активные соединения, определить и сохранить параметры соединения":
 
 Как из Вашей программы подключиться к Интернету, определить активные соединения, определить и сохранить параметры соединения. Все эти функции находятся в rasapi32.dll. Описания этих функций для Delphi есть в модуле res.pas.
 Эта программа заполняет ListBox1 всеми соединениями, ListView1 - всеми активными соединениями. При двойном щелчке по соединению в Edit1 и Edi2 кладутся имя пользователя и пароль (если он сохранен). Кнопка "Dial Up" устанавливает соединение, "Save" сохраняет имя пользователя и пароль. "Hang Up" разрывает соединение. "Update Entries" и "Udate Conns" обновляют информацию о соединениях. В том случае, если связь разорвалась сама, для установления соединения необходимо сначала нажать "Hang Up".
 Приложение:Переключить в обычный режим uses Ras; var CurrentState: string = '';    function StateStr(state: TRasConnState; error: longint): string;  begin   if error <> 0 then    begin      case RasGetErrorString(error, @buf, sizeof(buf)) of        0: result := buf;        ERROR_INVALID_PARAMETER: result := 'Invalid parameter';        else result := 'Error code: ' + IntToStr(error);      end;   end else case state of      RASCS_OpenPort: result := 'Opening port';      RASCS_PortOpened: result := 'Port opened';      RASCS_ConnectDevice: result := 'Connecting device';      RASCS_DeviceConnected: result := 'Device connected';      RASCS_AllDevicesConnected: result := 'All devices connected';      RASCS_Authenticate: result := 'Start authenticating';      RASCS_AuthNotify: result := 'Authentication: notify';      RASCS_AuthRetry: result := 'Authentication: retry';      RASCS_AuthCallback: result := 'Authentication: callback';      RASCS_AuthChangePassword: result := 'Authentication: change password';      RASCS_AuthProject: result := 'Authentication: projecting';      RASCS_AuthLinkSpeed: result := 'Authentication: link speed';      RASCS_AuthAck: result := 'Authentication: acknowledge';      RASCS_ReAuthenticate: result := 'Authentication: reauthenticate';      RASCS_Authenticated: result := 'Authenticated';      RASCS_PrepareForCallback: result := 'Preparing for callback';      RASCS_WaitForModemReset: result := 'Waiting for modem reset';      RASCS_WaitForCallback: result := 'Waiting for callback';      RASCS_Projected: result := 'Projected';      RASCS_StartAuthentication: result := 'Start authentication';      RASCS_CallbackComplete: result := 'Callback complete';      RASCS_LogonNetwork: result := 'Logging on network';       RASCS_Interactive: result := 'Interactive';      RASCS_RetryAuthentication: result := 'Retry Authentication';      RASCS_CallbackSetByCaller: result := 'Callback set by caller';      RASCS_PasswordExpired: result := 'Password expired';      RASCS_Connected: result := 'Connected';      RASCS_Disconnected: result := 'Disconnected';      else result := 'Unknown state';   end;end;   procedure FillEntries(s: TStrings);var   EntryCount, bufsize: longint;   entries: LPRasEntryName;   i: integer;begin   s.Clear;   s.BeginUpdate;   bufsize := 0;    RasEnumEntries(nil, nil, nil, bufsize, EntryCount);   if EntryCount > 0 then    begin       GetMem(entries, bufsize);      FillChar(entries^, bufsize, 0);      entries^.dwSize := sizeof(TRasEntryName);       RasEnumEntries(nil, nil, entries, bufsize, EntryCount);       for i := 0 to EntryCount - 1 do begin        s.Add(entries^.szEntryName);        inc(entries);      end;       dec(entries, EntryCount);      FreeMem(entries);   end;   s.EndUpdate;end;   procedure FillConnections(items: TListItems);var   conns: LPRasConn;   ConnCount, bufsize: longint;   li: TListItem;   i: integer;   status: TRASCONNSTATUS;begin   items.BeginUpdate;   items.Clear;   bufsize := 0;    RasEnumConnections(nil, bufsize, ConnCount);   if ConnCount > 0 then    begin       GetMem(conns, bufsize);      conns^.dwSize := sizeof(TRasConn);       RasEnumConnections(conns, bufsize, ConnCount);      status.dwSize := sizeof(TRasConnStatus);       for i := 0 to ConnCount - 1 do begin        li := items.Add;        li.Data := pointer(conns^.hrasconn);        li.Caption := conns^.szEntryName;        li.SubItems.Add(conns^.szDeviceType);        li.SubItems.Add(conns^.szDeviceName);        RasGetConnectStatus(conns^.hrasconn, status);        li.SubItems.Add(StateStr(status.rasconnstate, status.dwError));        inc(conns);      end;       dec(conns, ConnCount);      FreeMem(conns);   end;   items.EndUpdate;end;    procedure HangUpAndWait(conn: integer);var   status: TRasConnStatus;begin    status.dwSize := sizeof(TRasConnStatus);    repeat      Application.ProcessMessages;      sleep(0);   until RasGetConnectStatus(conn, status) = ERROR_INVALID_HANDLE;end;    procedure RasNotifier(msg: integer; state: TRasConnState;error: Cardinal); stdcall;begin   CurrentState := StateStr(state, error);   Form1.ListBox2.Items.Add(CurrentState);    FillConnections(Form1.ListView1.Items);   if error <> 0 then begin      Form1.Timer1.Enabled := false;      Form1.Caption := CurrentState;   end else begin      Form1.Timer1.Enabled := false;      Form1.Timer1.Enabled := true;      Form1.Timer1.Tag := 0;   end;end; procedure TForm1.FormCreate(Sender: TObject);begin     Timer1.Enabled := false;   Button1.Caption := 'Update Entries';   Button2.Caption := 'Update Conns';   Button3.Caption := 'Hang Up';   Button4.Caption := 'Dial Up';   Button5.Caption := 'Save';     ListView1.Columns.Add.Caption := 'Name';   ListView1.Columns.Add.Caption := 'Device Type';   ListView1.Columns.Add.Caption := 'Device Name';   ListView1.Columns.Add.Caption := 'State';    FillEntries(ListBox1.Items);   FillConnections(ListView1.Items);end; procedure TForm1.Button1Click(Sender: TObject);begin    FillEntries(ListBox1.Items);end; procedure TForm1.Button2Click(Sender: TObject);begin    FillConnections(ListView1.Items);end; procedure TForm1.Button3Click(Sender: TObject);begin     case ListView1.Items.Count of      0: Exit;      1: ListView1.Selected := ListView1.Items[0];      else if ListView1.Selected = nil then Exit;   end;    HangUpAndWait(longint(ListView1.Selected.Data)); end; procedure TForm1.Button4Click(Sender: TObject);var   params: TRasDialParams;   hRas: THRasConn;begin   if ListBox1.ItemIndex < 0 then Exit;   ListBox2.Clear;    FillChar(params, sizeof(TRasDialParams), 0);   params.dwSize := sizeof(TRasDialParams);   StrPCopy(params.szEntryName, ListBox1.Items[ListBox1.ItemIndex]);   StrPCopy(params.szUserName, Edit1.Text);   StrPCopy(params.szPassword, Edit2.Text);    RasDial(nil, nil, params, 0, @RasNotifier, hRas);end; procedure TForm1.Button5Click(Sender: TObject);var params: TRasDialParams;begin    params.dwSize := sizeof(TRasDialParams);   StrPCopy(params.szEntryName, ListBox1.Items[ListBox1.ItemIndex]);   StrPCopy(params.szUserName, Edit1.Text);   StrPCopy(params.szPassword, Edit2.Text);   RasSetEntryDialParams(nil, params, false);end; procedure TForm1.ListBox1DblClick(Sender: TObject);var   params: TRasDialParams;   passw: longbool;begin   if ListBox1.ItemIndex < 0 then Exit;    fillchar(params, sizeof(TRasDialParams), 0);   params.dwSize := sizeof(TRasDialParams);   StrPCopy(params.szEntryName, ListBox1.Items[ListBox1.ItemIndex]);   RasGetEntryDialParams(nil, params, passw);   Edit1.Text := params.szUserName;   if passw then begin       Edit2.Text := params.szPassword;      Button4.SetFocus;   end else begin       Edit2.Text := '';      Edit2.SetFocus;   end;end; procedure TForm1.Timer1Timer(Sender: TObject);begin   Form1.Caption := CurrentState + ' - ' + IntToStr(Timer1.Tag);Timer1.Tag := Timer1.Tag + 1;end;
|  | Ответ отправил: Feniks (статус: Бакалавр)Время отправки: 17 сентября 2007, 16:56
 Оценка за ответ: 5
 |  
 Мини-форум вопросаМини-форум пуст. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |