Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 928

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Кто работал с RAS API скажите:
Как с помощью RAS установить и разорвать удаленное соединение с интернетом? Если можно опишите поподробнее параметры. И как узнать установлено ли соединение.

Евгений Eklmn Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Евгений 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".

Приложение:
  1. uses Ras;
  2.  
  3. var
  4.  
  5. CurrentState: string = '';
  6.  
  7.  
  8.  
  9.  
  10. function StateStr(state: TRasConnState; error: longint): string;
  11.  
  12.  
  13. begin
  14. if error <> 0 then
  15. begin
  16. case RasGetErrorString(error, @buf, sizeof(buf)) of
  17. 0: result := buf;
  18. ERROR_INVALID_PARAMETER: result := 'Invalid parameter';
  19. else result := 'Error code: ' + IntToStr(error);
  20. end;
  21. end else case state of
  22. RASCS_OpenPort: result := 'Opening port';
  23. RASCS_PortOpened: result := 'Port opened';
  24. RASCS_ConnectDevice: result := 'Connecting device';
  25. RASCS_DeviceConnected: result := 'Device connected';
  26. RASCS_AllDevicesConnected: result := 'All devices connected';
  27. RASCS_Authenticate: result := 'Start authenticating';
  28. RASCS_AuthNotify: result := 'Authentication: notify';
  29. RASCS_AuthRetry: result := 'Authentication: retry';
  30. RASCS_AuthCallback: result := 'Authentication: callback';
  31. RASCS_AuthChangePassword: result := 'Authentication: change password';
  32. RASCS_AuthProject: result := 'Authentication: projecting';
  33. RASCS_AuthLinkSpeed: result := 'Authentication: link speed';
  34. RASCS_AuthAck: result := 'Authentication: acknowledge';
  35. RASCS_ReAuthenticate: result := 'Authentication: reauthenticate';
  36. RASCS_Authenticated: result := 'Authenticated';
  37. RASCS_PrepareForCallback: result := 'Preparing for callback';
  38. RASCS_WaitForModemReset: result := 'Waiting for modem reset';
  39. RASCS_WaitForCallback: result := 'Waiting for callback';
  40. RASCS_Projected: result := 'Projected';
  41. RASCS_StartAuthentication: result := 'Start authentication';
  42. RASCS_CallbackComplete: result := 'Callback complete';
  43. RASCS_LogonNetwork: result := 'Logging on network';
  44.  
  45. RASCS_Interactive: result := 'Interactive';
  46. RASCS_RetryAuthentication: result := 'Retry Authentication';
  47. RASCS_CallbackSetByCaller: result := 'Callback set by caller';
  48. RASCS_PasswordExpired: result := 'Password expired';
  49. RASCS_Connected: result := 'Connected';
  50. RASCS_Disconnected: result := 'Disconnected';
  51. else result := 'Unknown state';
  52. end;
  53. end;
  54.  
  55.  
  56.  
  57. procedure FillEntries(s: TStrings);
  58. var
  59. EntryCount, bufsize: longint;
  60. entries: LPRasEntryName;
  61. i: integer;
  62. begin
  63. s.Clear;
  64. s.BeginUpdate;
  65. bufsize := 0;
  66.  
  67. RasEnumEntries(nil, nil, nil, bufsize, EntryCount);
  68. if EntryCount > 0 then
  69. begin
  70.  
  71. GetMem(entries, bufsize);
  72. FillChar(entries^, bufsize, 0);
  73. entries^.dwSize := sizeof(TRasEntryName);
  74.  
  75. RasEnumEntries(nil, nil, entries, bufsize, EntryCount);
  76.  
  77. for i := 0 to EntryCount - 1 do begin
  78. s.Add(entries^.szEntryName);
  79. inc(entries);
  80. end;
  81.  
  82. dec(entries, EntryCount);
  83. FreeMem(entries);
  84. end;
  85. s.EndUpdate;
  86. end;
  87.  
  88.  
  89.  
  90. procedure FillConnections(items: TListItems);
  91. var
  92. conns: LPRasConn;
  93. ConnCount, bufsize: longint;
  94. li: TListItem;
  95. i: integer;
  96. status: TRASCONNSTATUS;
  97. begin
  98. items.BeginUpdate;
  99. items.Clear;
  100. bufsize := 0;
  101.  
  102. RasEnumConnections(nil, bufsize, ConnCount);
  103. if ConnCount > 0 then
  104. begin
  105.  
  106. GetMem(conns, bufsize);
  107. conns^.dwSize := sizeof(TRasConn);
  108.  
  109. RasEnumConnections(conns, bufsize, ConnCount);
  110. status.dwSize := sizeof(TRasConnStatus);
  111.  
  112. for i := 0 to ConnCount - 1 do begin
  113. li := items.Add;
  114. li.Data := pointer(conns^.hrasconn);
  115. li.Caption := conns^.szEntryName;
  116. li.SubItems.Add(conns^.szDeviceType);
  117. li.SubItems.Add(conns^.szDeviceName);
  118. RasGetConnectStatus(conns^.hrasconn, status);
  119. li.SubItems.Add(StateStr(status.rasconnstate, status.dwError));
  120. inc(conns);
  121. end;
  122.  
  123. dec(conns, ConnCount);
  124. FreeMem(conns);
  125. end;
  126. items.EndUpdate;
  127. end;
  128.  
  129.  
  130.  
  131.  
  132. procedure HangUpAndWait(conn: integer);
  133. var
  134. status: TRasConnStatus;
  135. begin
  136.  
  137. status.dwSize := sizeof(TRasConnStatus);
  138.  
  139. repeat
  140. Application.ProcessMessages;
  141. sleep(0);
  142. until RasGetConnectStatus(conn, status) = ERROR_INVALID_HANDLE;
  143. end;
  144.  
  145.  
  146.  
  147.  
  148. procedure RasNotifier(msg: integer; state: TRasConnState;
  149. error: Cardinal); stdcall;
  150. begin
  151. CurrentState := StateStr(state, error);
  152. Form1.ListBox2.Items.Add(CurrentState);
  153.  
  154. FillConnections(Form1.ListView1.Items);
  155. if error <> 0 then begin
  156. Form1.Timer1.Enabled := false;
  157. Form1.Caption := CurrentState;
  158. end else begin
  159. Form1.Timer1.Enabled := false;
  160. Form1.Timer1.Enabled := true;
  161. Form1.Timer1.Tag := 0;
  162. end;
  163. end;
  164.  
  165. procedure TForm1.FormCreate(Sender: TObject);
  166. begin
  167.  
  168.  
  169. Timer1.Enabled := false;
  170. Button1.Caption := 'Update Entries';
  171. Button2.Caption := 'Update Conns';
  172. Button3.Caption := 'Hang Up';
  173. Button4.Caption := 'Dial Up';
  174. Button5.Caption := 'Save';
  175.  
  176.  
  177. ListView1.Columns.Add.Caption := 'Name';
  178. ListView1.Columns.Add.Caption := 'Device Type';
  179. ListView1.Columns.Add.Caption := 'Device Name';
  180. ListView1.Columns.Add.Caption := 'State';
  181.  
  182. FillEntries(ListBox1.Items);
  183. FillConnections(ListView1.Items);
  184. end;
  185.  
  186. procedure TForm1.Button1Click(Sender: TObject);
  187. begin
  188.  
  189. FillEntries(ListBox1.Items);
  190. end;
  191.  
  192. procedure TForm1.Button2Click(Sender: TObject);
  193. begin
  194.  
  195. FillConnections(ListView1.Items);
  196. end;
  197.  
  198. procedure TForm1.Button3Click(Sender: TObject);
  199. begin
  200.  
  201.  
  202. case ListView1.Items.Count of
  203. 0: Exit;
  204. 1: ListView1.Selected := ListView1.Items[0];
  205. else if ListView1.Selected = nil then Exit;
  206. end;
  207.  
  208. HangUpAndWait(longint(ListView1.Selected.Data));
  209.  
  210. end;
  211.  
  212. procedure TForm1.Button4Click(Sender: TObject);
  213. var
  214. params: TRasDialParams;
  215. hRas: THRasConn;
  216. begin
  217. if ListBox1.ItemIndex < 0 then Exit;
  218. ListBox2.Clear;
  219.  
  220. FillChar(params, sizeof(TRasDialParams), 0);
  221. params.dwSize := sizeof(TRasDialParams);
  222. StrPCopy(params.szEntryName, ListBox1.Items[ListBox1.ItemIndex]);
  223. StrPCopy(params.szUserName, Edit1.Text);
  224. StrPCopy(params.szPassword, Edit2.Text);
  225.  
  226. RasDial(nil, nil, params, 0, @RasNotifier, hRas);
  227. end;
  228.  
  229. procedure TForm1.Button5Click(Sender: TObject);
  230. var params: TRasDialParams;
  231. begin
  232.  
  233. params.dwSize := sizeof(TRasDialParams);
  234. StrPCopy(params.szEntryName, ListBox1.Items[ListBox1.ItemIndex]);
  235. StrPCopy(params.szUserName, Edit1.Text);
  236. StrPCopy(params.szPassword, Edit2.Text);
  237. RasSetEntryDialParams(nil, params, false);
  238. end;
  239.  
  240. procedure TForm1.ListBox1DblClick(Sender: TObject);
  241. var
  242. params: TRasDialParams;
  243. passw: longbool;
  244. begin
  245. if ListBox1.ItemIndex < 0 then Exit;
  246.  
  247. fillchar(params, sizeof(TRasDialParams), 0);
  248. params.dwSize := sizeof(TRasDialParams);
  249. StrPCopy(params.szEntryName, ListBox1.Items[ListBox1.ItemIndex]);
  250. RasGetEntryDialParams(nil, params, passw);
  251. Edit1.Text := params.szUserName;
  252. if passw then begin
  253.  
  254. Edit2.Text := params.szPassword;
  255. Button4.SetFocus;
  256. end else begin
  257.  
  258. Edit2.Text := '';
  259. Edit2.SetFocus;
  260. end;
  261. end;
  262.  
  263. procedure TForm1.Timer1Timer(Sender: TObject);
  264. begin
  265.  
  266.  
  267.  
  268. Form1.Caption := CurrentState + ' - ' + IntToStr(Timer1.Tag);
  269. Timer1.Tag := Timer1.Tag + 1;
  270. end;


Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 17 сентября 2007, 16:56
Оценка за ответ: 5


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:33
Выполнено за 0.02 сек.