|
Вопрос # 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
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|