Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];

Вниз

Связь с интернетом   Найти похожие ветки 

 
Weiss ©   (2005-10-04 17:25) [0]

Как програмно прервать соединение с интернетом?


 
Profik ©   (2005-10-04 17:27) [1]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   edtEntry: TEdit;  // holds the name of the connection, e.g. "bluewin"
   edtUser: TEdit;   // the username for the above connection
   edtPass: TEdit;   // and the password
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

uses shellapi;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var  
 cmd, par, fil, dir: PChar;
begin
 // establish the connection
 // die Verbindung aufbauen
 // rasdial.exe entryname username password
 cmd := "open";
 fil := "rasdial.exe";
 par := PChar(edtEntry.Text + " " + edtUser.Text + " " + edtPass.Text);
 dir := "C:";
 // call rasdial.exe with Shellexecute
 // rasdial mit Shellexecute aufrufen
 ShellExecute(Self.Handle, cmd, fil, par, dir, SW_SHOWMINNOACTIVE);
end;

procedure TForm1.Button2Click(Sender: TObject);
var  
 cmd, par, fil, dir: PChar;
begin
 // disconnect the connection to the Internet
 // Verbindung zum Internet abbrechen
 cmd := "open";
 fil := "rasdial.exe";
 par := PChar(edtEntry.Text + " /DISCONNECT");
 dir := "C:";
 ShellExecute(Self.Handle, cmd, fil, par, dir, SW_SHOWMINNOACTIVE);
end;
end.


 
Profik ©   (2005-10-04 19:34) [2]

как из Вашей программы подключиться к Интернету, определить активные соединения, определить и сохранить параметры соединения. Все эти функции находятся в 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;


 
Profik ©   (2005-10-04 19:36) [3]

{ Процедура разрывает соединение и
 дожидается завершения операции: }
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;


 
Джо ©   (2005-10-04 20:13) [4]

Может, воспользоваться функцией InternetHangUp (дает комманду модему разорвать указанное соединение). Это для dial-up, естественно.
П.С. uses WinInet.


 
Копир ©   (2005-10-04 22:20) [5]

>Как програмно прервать соединение с интернетом?

PostMessage(FindWindow(Nil, "Установлена связь с Соединение"),
WM_QUIT, 0, 0);



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.043 c
1-1128346886
@Ujin
2005-10-03 17:41
2005.10.23
Как можно добавить в TCustomForm published свойства?


11-1109400580
NAGRIS
2005-02-26 09:49
2005.10.23
TKolTreeView


1-1128285792
step1k
2005-10-03 00:43
2005.10.23
вопрос про динамику


2-1127978616
begin
2005-09-29 11:23
2005.10.23
Выполнить что-то до открытия главной формы


5-1104426662
Stanislav_SM
2004-12-30 20:11
2005.10.23
Отображение события в инспекторе объектов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский