Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подключиться к Интернету, определить активные соединения, определить и сохранить параметры соединения 
:(
    Опции темы
Poseidon
Дата 19.5.2005, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 4
Всего: 133



как из Вашей программы подключиться к Интернету, определить активные соединения, определить и сохранить параметры соединения. Все эти функции находятся в rasapi32.dll. Описания этих функций для Delphi есть в модуле res.pas. Его можно скачать на сайте program.dax.ru (14 Кбайт). 

Эта программа заполняет ListBox1 всеми соединениями, ListView1 - всеми активными соединениями. При двойном щелчке по соединению в Edit1 и Edi2 кладутся имя пользователя и пароль (если он сохранен). Кнопка "Dial Up" устанавливает соединение, "Save" сохраняет имя пользователя и пароль. "Hang Up" разрывает соединение. "Update Entries" и "Udate Conns" обновляют информацию о соединениях. В том случае, если связь разорвалась сама, для установления соединения необходимо сначала нажать "Hang Up". 

Скачать необходимые для компиляции файлы проекта можно на program.dax.ru. Дустапны проекты для Delphi3 и для Delphi5

Код
uses Ras; 

var 
  CurrentState: string = ''; 

{ Эта функция возвращает строку с 
  рассшифровкой значений state и error: } 
function StateStr(state: TRasConnState; error: longint): string; 
var buf: array [0..511] of char; { В рelp-е написано, 
                                   что 512 байт хватит всегда } 
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; 

// Заполнение s всеми соединениями: 
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); 
    // Заполнение s названиями соединений: 
    for i := 0 to EntryCount - 1 do begin 
      s.Add(entries^.szEntryName); 
      inc(entries); 
    end; 
    // Освобождение памяти: 
    dec(entries, EntryCount); 
    FreeMem(entries); 
  end; 
  s.EndUpdate; 
end; 



// Заполнение items всеми активными соединениями: 
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); 
    // Заполнение conns информацией об активных соединениях: 
    RasEnumConnections(conns, bufsize, ConnCount); 
    status.dwSize := sizeof(TRasConnStatus); 
    // Заполнение items названиями соединений: 
    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 
  RasHangUp(conn); // Разрыв соединения 
  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 
  { Установка свойств компонентов (может быть реализована 
    через ObjectInspector: } 
  Timer1.Enabled := false; 
  Button1.Caption := 'Update Entries'; 
  Button2.Caption := 'Update Conns'; 
  Button3.Caption := 'Hang Up'; 
  Button4.Caption := 'Dial Up'; 
  Button5.Caption := 'Save'; 
  ListView1.ViewStyle := vsReport; // Вид таблицы 
  // Добавление колонок: 
  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)); 
  // Обновление информации об актыв  FillConnections(ListView1.Items); 
end; 

procedure TForm1.Button4Click(Sender: TObject); 
var 
  params: TRasDialParams; 
  hRas: THRasConn; 
begin 
  if ListBox1.ItemIndex < 0 then Exit; 
  ListBox2.Clear; 

  // Заполнение params 
  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; 



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1040 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.