<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=30572&amp;view=findpost&amp;p=207802</guid>
        <pubDate>Sun, 09 Nov 2003 11:28:47 +0000</pubDate>
        <title>Работа с RasAPI</title>
        <link>https://forum.sources.ru/index.php?showtopic=30572&amp;view=findpost&amp;p=207802</link>
        <description><![CDATA[Song:  Оригинал статьи расположен по адресу <a href='http://www.delphikingdom.ru/helloworld/rasapi.htm' target='_blank'>http://www.delphikingdom.ru/helloworld/rasapi.htm</a> ]]></description>
        <author>Song</author>
        <category>Интернет, сети, протоколы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=30572&amp;view=findpost&amp;p=206790</guid>
        <pubDate>Sun, 09 Nov 2003 11:26:58 +0000</pubDate>
        <title>Работа с RasAPI</title>
        <link>https://forum.sources.ru/index.php?showtopic=30572&amp;view=findpost&amp;p=206790</link>
        <description><![CDATA[Song: [doHTML]<br>&lt;P ALIGN=&quot;right&quot;&gt;&lt;I&gt;Особые благодарности&lt;BR&gt;<br> Королеве дельфийского королевства &lt;BR&gt;<br>Елене Филипповой,&lt;BR&gt;<br>которая подвигла меня на ваяние сего опуса.&lt;/I&gt;&lt;/P&gt;<br><br>&lt;P&gt;&lt;/P&gt;<br>&lt;TABLE WIDTH=&quot;100%&quot; BGCOLOR=&quot;#FAEBD7&quot; CELLPADDING=&quot;3&quot; CELLSPACING=&quot;0&quot; BORDER=&quot;0&quot;&gt;&lt;TR&gt;&lt;TD&gt;<br>&lt;B&gt;Вместо предисловия&lt;/B&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;<br>&lt;P&gt;&lt;/P&gt;<br>Я не являюсь профессиональным программистом и никогда не писал статьей по программированию. Поэтому &quot;продвинутых&quot; специалистов прошу не утруждать себя чтением ниже изложенного дабы избежать обструкции по поводу допущенных мною в настоящей статье ошибок и вольностей. <br>&lt;A NAME=&quot;_01&quot;&gt;&lt;/A&gt;&lt;P&gt;Итак. Многие из &quot;непродвинутых&quot; дельфийцев, пытаясь использовать интернет-компоненты, сталкиваются с проблемой &quot;удаленного соединения&quot; &lt;A HREF=&quot;#01&quot;&gt;(&lt;B&gt;*&lt;/B&gt;)&lt;/A&gt; . Собственно подключаться не трудно - чаще всего такие компоненты с помощью системной библиотеки wsock32.dll сами инициализируют подключение к Интернет по &quot;удаленному соединению&quot;. Гораздо труднее бывает после интернет-сессии отключить &quot;удаленное соединение&quot;. Поэтому на Круглом столе &quot;Королевства Дельфи&quot; с регулярностью наступления &quot;критических дней&quot; появляются вопросы (в том числе и мои):&lt;/P&gt;<br>&lt;BLOCKQUOTE&gt;&lt;B&gt;&lt;I&gt;&quot;как после .... завершить соединение по удаленному доступу?&quot;&lt;/I&gt;&lt;/B&gt;&lt;/BLOCKQUOTE&gt;<br>А &quot;продвинутые гуру&quot; от программирования с завидным постоянством на них отвечают:&lt;BR&gt;<br>&lt;BLOCKQUOTE&gt;&lt;B&gt;&lt;I&gt;&quot;смотри Ras API...&quot;&lt;/I&gt;&lt;/B&gt;&lt;/BLOCKQUOTE&gt;<br>Давайте и посмотрим, что такое Ras API и с чем его едят :)&lt;BR&gt;<br>&lt;B&gt;Ras API - Remote Access Service Application Programming Interface.&lt;/B&gt; По-русски: &quot;интерфейс программирования приложений, использующих службу удаленного доступа&quot;. Этот интерфейс как раз и служит для соединения по &quot;удаленному доступу&quot;, а также отслеживания его состояния, отсоединения от телефонной линии, создания новых &quot;удаленных соединений&quot;, изменения свойств уже созданных &quot;соединений&quot; и многого, многого другого. В библиотеку rasapi32.dll включено 97 экспортируемых функций. Даже в Help для Дельфи Microsoft любезно включило описание работы с функциями этой библиотеки. Напечатайте где-нибудь в проекте, например, RasDial и нажмите F1 - убедитесь сами. Казалось бы в чем проблемы? Ан нет&#33; В поставке Дельфи нет интерфейсного модуля для работы с этой библиотекой. Что такое интерфейсный модуль? Это Pascal Unit - *.pas или *.dcu, в котором описаны используемые в DLL константы, типы переменных, функции и процедуры, порядок обращения к ним и др. Например, Windows.pas (обратите внимание на самую первую запись, включаемую в клаузу Uses) - это интерфейсный модуль для системных библиотек kernel32.dll, user32.dll и gdi32.dll и др., который позволяет Pascal-программам обращаться к процедурам и функциям этих библиотек. <br>&lt;P&gt;&lt;/P&gt;<br>После некоторого скитания по Интернет мне удалось обнаружить столь нужный нам всем интерфейсный модуль для rasapi.dll - называется он RasUnit.pas.<br>&lt;P&gt;&lt;/P&gt;<br>Весь модуль описывать здесь я не буду. Опишу только пять функций, позволяющих соединиться с Интернет по телефонной линии с помощью модема, отследить состояние &quot;удаленного соединения&quot; и отключиться от телефонной линии по завершению интернет-сеанса. <br>&lt;P&gt;&lt;/P&gt;<br>&lt;TABLE WIDTH=&quot;100%&quot; BGCOLOR=&quot;#FAEBD7&quot; CELLPADDING=&quot;3&quot; CELLSPACING=&quot;0&quot; BORDER=&quot;0&quot;&gt;&lt;TR&gt;&lt;TD&gt;<br>&lt;B&gt;1. Получение сведений о всех зарегистрированных в системе <br>&quot;удаленных соединениях&quot;.&lt;/B&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;<br>&lt;P&gt;&lt;/P&gt;<br>&lt;A NAME=&quot;_02&quot;&gt;&lt;/A&gt;Для получения сведений о всех зарегистрированных в системе &quot;удаленных соединений&quot; используется библиотечная функция &lt;B&gt;&lt;A HREF=&quot;#02&quot;&gt;(**)&lt;/A&gt;&lt;/B&gt;  &lt;B&gt;RasEnumEntries&lt;/B&gt;&lt;BR&gt;<br>Рассмотрим работу этой функции. Прежде всего определим переменные:&lt;BR&gt;<br>&lt;DL&gt;<br>&lt;DT&gt;&lt;B&gt;BuffSize: Integer;&lt;/B&gt; &lt;DD&gt; размер массива из AnsiChar, в который будут помещаться <br>                               cведения об &quot;удаленных соединениях&quot;<br>&lt;DT&gt;&lt;B&gt;Entries: Integer;&lt;/B&gt;   &lt;DD&gt; количество зарегистрированных &quot;удаленных соединений&quot;                     <br>&lt;DT&gt;&lt;B&gt;Entry : Array[1..MaxEntries] of TRasEntryName;&lt;/B&gt; &lt;DD&gt; массив состоящий из<br>                                переменных, в  которые  будут помещены сведения об<br>                                &quot;удаленных соединениях&quot;, где константа  MaxEntries -<br>                                количество возможных соединений, TRasEntryName - <br>                                определение (type) записи состоящей из двух полей <br>                                dwSize и szEntryName (определены в RasUnit.pas)<br>&lt;DT&gt;&lt;B&gt;X, Result_ : Integer;&lt;/B&gt; &lt;DD&gt; необходимые процедурные переменные<br>&lt;DT&gt;&lt;B&gt;AllEntries: TStrings;&lt;/B&gt; &lt;DD&gt; сюда мы поместим  названия &quot;удаленных соединений&quot; <br>                                   для  дальнейшей работы с ними<br>&lt;/DL&gt;<br>Перейдем к описанию работы функции RasEnumEntries.&lt;BR&gt;<br>1. Определим размер переменной типа TRasEntryName и инициализируем переменную Entry, поместив в поле dwSize полученный размер.<br>&lt;PRE&gt;Entry[1].dwSize:=SizeOf(TRasEntryName)&lt;/PRE&gt;<br>2. Определим размер AnsiChar-массива, в который поместим сведения обо всех &quot;удаленных соединениях&quot;&lt;BR&gt;<br>&lt;PRE&gt;BuffSize:=SizeOf(TRasEntryName)*MaxEntries&lt;/PRE&gt;<br>3. Вызовем функцию RasEnumEntries в результате чего получим искомые результаты:&lt;BR&gt;<br>&lt;TT&gt;Result_:=RasEnumEntries(nil, nil, @Entry[1], BuffSize, Entries)&lt;/TT&gt;, где&lt;BR&gt;<br>&lt;UL&gt;<br>	&lt;LI&gt;&lt;B&gt;Result_&lt;/B&gt;- в случае успешного выполнения возвращает 0, в противном случае получим ERROR_BUFFER_TOO_SMALL (буфер слишком маленький) или ERROR_NOT_ENOUGH_MEMORY(не хватает памяти).&lt;BR&gt;<br>	&lt;LI&gt;&lt;B&gt;BuffSize&lt;/B&gt; - указанный нами размер AnsiChar-массива.&lt;BR&gt;<br>	&lt;LI&gt;&lt;B&gt;@Entry[1]&lt;/B&gt;- получим указатель на первый элемент массива, в который поместились необходимые нам сведения. &lt;BR&gt;<br>	&lt;LI&gt;&lt;B&gt;Entries&lt;/B&gt; - получим количество зарегистрированных в системе &quot;удаленных доступов&quot;.<br>&lt;/UL&gt;<br>&lt;P&gt;Дальше уже просто. &lt;/P&gt;<br>В случае успешного выполнения функции и существования хотя бы одного зарегистрированного &quot;удаленного соединения&quot; заполним нашу переменную <br>&lt;PRE&gt;<br>If (Result_=0) and (Entries&gt;0) Then<br>Begin<br>	AllEntries:= TStringList.Create;<br>	For X:=1 To Entries Do<br>	Begin<br>		AllEntries.Add(Entry[x].szEntryName);<br>	End;<br>&lt;FONT COLOR=&quot;#000099&quot;&gt;	.....здесь мы работает со своей переменной, например, <br>	помещаем сведения об &quot;удаленных соединениях&quot; в ListBox......&lt;/FONT&gt;<br><br>	AllEntries.Free;<br>End;<br>&lt;/PRE&gt;<br>&lt;P&gt;&lt;/P&gt;<br>&lt;TABLE WIDTH=&quot;100%&quot; BGCOLOR=&quot;#FAEBD7&quot; CELLPADDING=&quot;3&quot; CELLSPACING=&quot;0&quot; BORDER=&quot;0&quot;&gt;&lt;TR&gt;&lt;TD&gt;<br>&lt;B&gt;2. Соединение с интернет-сервером через выбранный &quot;удаленный доступ&quot; и получение статуса соединения.&lt;/B&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;<br>&lt;P&gt;&lt;/P&gt;<br>Для соединения с интернет-сервером используются две библиотечные функции &lt;B&gt;RasGetEntryDialParams&lt;/B&gt; и &lt;B&gt;RasDial&lt;/B&gt;. Для обработки ошибок, возникших в процессе соединения, используется еще одна библиотечная функция  &lt;B&gt;RasGetErrorString&lt;/B&gt;.<br>&lt;BR&gt;Определим необходимые переменные.&lt;BR&gt;<br>&lt;P&gt;Глобальные:&lt;/P&gt;<br>&lt;DL&gt;<br>	&lt;DT&gt;&lt;B&gt;MyDialParam : TMyDialParam&lt;/B&gt;&lt;DD&gt;переменная состояния соединения, где<br>&lt;PRE&gt;TMyDialParam = Record<br>AMsg : Integer; - код сообщения<br>AState : TRasConnState; - статус соединения (тип переменной определен в  RasUnit.pas)<br>AError : Integer; - код ошибки&lt;/PRE&gt;<br><br>	&lt;DT&gt;&lt;B&gt;hRas: ThRASConn &lt;/B&gt;&lt;DD&gt;в эту переменную будет помещен handle (так сказать &quot;ИНН&quot;)   &quot;удаленного соединения&quot;, к этой переменной <br> будет обращаться функция &lt;B&gt;RasHangUp&lt;/B&gt; для завершения <br>соединения, тип переменной описан в RasUnit.pas<br>&lt;/DL&gt;<br>&lt;P&gt;Локальные:&lt;/P&gt;<br>&lt;DL&gt;<br>	&lt;DT&gt;Fp:LongBool &lt;DD&gt;если в &quot;удаленном доступе&quot; не указан пароль пользователя, то <br>                         эта переменная устанавливается в False и появляется <br>                         приглашение ввести пароль, если пароль указан, то переменная<br>                         устанавливается в True и приглашение не появляется.<br><br>	&lt;DT&gt;DialParams: TRasDialParams &lt;DD&gt;переменная, в которую будут переданы <br>                         параметры &quot;удаленного соединения&quot;, описывать тип этой <br>                         переменной я не буду - он хорошо описан в Win32 Programmer&#39;s <br>                         Reference (кто не знает - это один из разделов Help&#39;а, <br>                         поставляемого вместе с Delphi)  и определен в RasUnit.pas<br><br>	&lt;DT&gt;AEntryDial:String &lt;DD&gt;переменная, в которую поместим название &quot;удаленного <br>                          соединения&quot;<br><br>	&lt;DT&gt;R: Integer      &lt;DD&gt;результат выполнения библиотечных функций<br>	&lt;DT&gt;C : Array[0..100] of Char &lt;DD&gt;переменная, в которую записывается текст <br>                         сообщения об ошибке<br>&lt;/DL&gt;<br>&lt;A NAME=&quot;_03&quot;&gt;&lt;/A&gt;Кроме переменных необходимо также определить CallBack-процедуру, которая будет использована в функции &lt;B&gt;RasDial&lt;/B&gt; &lt;B&gt;&lt;A HREF=&quot;#03&quot;&gt;(***)&lt;/A&gt;&lt;/B&gt;.  <br>&lt;PRE&gt;Procedure RasCallBack (msg: Integer;<br>		state: TRasConnState; <br>		error: Integer); stdcall &lt;B&gt;&lt;A HREF=&quot;#04&quot;&gt;(****)&lt;/A&gt;&lt;/B&gt;  , где<br><br>msg: Integer - код сообщения<br>state: TRasConnState - состояние соединения<br>error: Integer - код ошибки<br> &lt;/PRE&gt;<br>В этой процедуре передадим глобальной переменной MyDialParam значения указанных переменных.<br>&lt;PRE&gt;MyDialParam.AMsg:=msg;<br>MyDialParam.AState:=state;<br>MyDialParam.AError:=error;<br>&lt;/PRE&gt;<br>А также вызовем функцию GetStatusString (будет описана ниже), которая сообщит нам в Label1.Caption о состоянии соединения.<br>&lt;PRE&gt;<br>Form1.Label1.Caption:= GetStatusString(MyDialParam.AState,MyDialParam.AError);<br>Form1.Label1.Update;&lt;FONT COLOR=&quot;#000099&quot;&gt;(на всякий случай).&lt;/FONT&gt;<br>&lt;/PRE&gt;<br>Все, на этом с CallBack процедурой закончено.<br>&lt;P&gt;&lt;/P&gt;<br>Переходим к описанию процесса подключения к &quot;удаленному соединения&quot;.<br>&lt;OL&gt;<br>	&lt;LI&gt;Получим название выбранного нами &quot;удаленного соединения&quot;<br>&lt;PRE&gt;AEntryDial:=ListBox1.Items.Strings[ListBox1.ItemIndex];&lt;/PRE&gt;<br>	&lt;LI&gt;Заполним все поля переменной DialParams нолями.<br>&lt;PRE&gt;FillChar(DialParams, SizeOf(TRasDialParams), 0);&lt;/PRE&gt;<br>	&lt;LI&gt;Инициализируем переменную DialParams и поместим в поле szEntryName этой переменной название выбранного &quot;удаленного соединения&quot;<br>&lt;PRE&gt;With DialParams Do<br>Begin<br>    dwSize:=Sizeof(TRasDialParams);<br>    StrPCopy(szEntryName, FEntry2Dial);<br>End;<br>&lt;/PRE&gt;<br>	&lt;LI&gt;Вызовем библиотечную функцию RasGetEntryDialParams, которая заполнит оставшиеся незаполненными поля переменной DialParams<br>&lt;PRE&gt;R:=RasGetEntryDialParams(nil, DialParams, Fp);&lt;/PRE&gt;<br>	&lt;LI&gt;Далее, если все удачно (см. значение переменной R), вызываем библиотечную функцию &lt;B&gt;RasDial&lt;/B&gt;, поместив в нее переменную &lt;B&gt;DialParams&lt;/B&gt; и указав на описанную выше CallBack-процедуру &lt;B&gt;RasCallBack&lt;/B&gt;. В случае ошибок в работе функции &lt;B&gt;RasDial&lt;/B&gt; вызовем библиотечную функцию обработки ошибок &lt;B&gt;RasGetErrorString&lt;/B&gt;, которая даст нам текст сообщения об ошибке, и выйдем из процедуры.<br>&lt;PRE&gt;<br>If R=0 then<br>Begin<br>	Application.ProcessMessages ; &lt;B&gt;&lt;A HREF=&quot;#05&quot;&gt;(*****)&lt;/A&gt;&lt;/B&gt;<br>	R:=RasDial(nil, nil, DialParams, 0, @RasCallback, hRAS);<br>	If R&lt;&gt;0 then<br>	Begin<br>		RasGetErrorString(R,C,100);<br>		MessageBox(0,C,&#39;Ошибка&#33;&#39;,MB_OK);<br>		Exit;<br>	End;<br>End;<br>&lt;/PRE&gt;<br>	&lt;LI&gt;6.  На этом все&#33;<br>&lt;/OL&gt;<br>Напоследок опишем &lt;BR&gt;<br>&lt;B&gt;Function GetStatusString(State: TRasConnState; Error: Integer): String &lt;/B&gt;&lt;BR&gt;<br>которая даст нам состояние соединения. Думаю, что переменные State и Error уже не требуют объяснения.<br>&lt;PRE&gt;<br>If Error&lt;&gt;0 then<br>Begin<br>    RasGetErrorString(Error, C, 100);<br>    Result:=C;<br>End Else<br>Begin<br>    S:=&#39;&#39;;<br>    Case State Of<br>      RASCS_OpenPort:<br>        S:=&lt;FONT COLOR=&quot;#FF0000&quot;&gt;&#39;Opening port&#39;&lt;/FONT&gt;;<br>&lt;FONT COLOR=&quot;#000099&quot;&gt;..................................<br>вырезано....<br>.................................&lt;/FONT&gt;<br>       RASCS_Disconnected:<br>        S:=&lt;FONT COLOR=&quot;#FF0000&quot;&gt;&#39;Disconnected&#39;&lt;/FONT&gt;;<br>      End;<br>Result:=S;<br>End;<br>&lt;/PRE&gt;<br>Теперь уже совсем все с подключением &quot;удаленного соединения&quot; и получением его статуса&#33;<br>&lt;P&gt;&lt;/P&gt;<br>&lt;TABLE WIDTH=&quot;100%&quot; BGCOLOR=&quot;#FAEBD7&quot; CELLPADDING=&quot;3&quot; CELLSPACING=&quot;0&quot; BORDER=&quot;0&quot;&gt;&lt;TR&gt;&lt;TD&gt;<br>&lt;B&gt;3.  Завершение удаленного соединения.&lt;/B&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;<br>&lt;P&gt;&lt;/P&gt;<br>Самый распространенный вопрос по рассматриваемой нами теме это - <br>&lt;BLOCKQUOTE&gt;&lt;B&gt;&lt;I&gt;&quot;как после .... завершить соединение по удаленному доступу?&quot;&lt;/I&gt;&lt;/B&gt;&lt;/BLOCKQUOTE&gt;<br>После того, что мы уже рассмотрели, ответ на этот вопрос покажется очень простым - надо вызвать библиотечную функцию &lt;B&gt;RasHangUp&lt;/B&gt; с одной единственной уже описанной нами переменной &lt;B&gt;hRas: ThRASConn&lt;/B&gt;.<br>&lt;PRE&gt;RasHangUp(hRas)&lt;/PRE&gt;<br>&lt;P ALIGN=&quot;CENTER&quot;&gt;&lt;B&gt;Удачи&#33;&lt;/B&gt;&lt;/P&gt;<br>Интерфейсный модуль RasUnit.pas и проект, использующий рассмотренные нами функции библиотеки rasapi32.dll, прилагается: &lt;BR&gt;<br>Файлы проекта + RasUnit : &lt;B&gt;&lt;A HREF=&quot;http://delphi.mtu-net.ru/zip/rasapi.zip&quot;&gt;RasAPI.zip&lt;/A&gt;&lt;/B&gt; (15 K)<br><br><br>&lt;P ALIGN=&quot;RIGHT&quot;&gt;Авторские права &lt;BR&gt;<br>&lt;B&gt;&copy; &lt;A HREF=&quot;http://www.delphikingdom.com/asp/users.asp?ID=348&quot;&gt;Александр  Терехов&lt;/A&gt; &#153; 2001&lt;/B&gt;, &lt;BR&gt;<br>&lt;/P&gt;<br>&lt;HR&gt;<br>&lt;B&gt;Примечания:&lt;/B&gt;&lt;BR&gt;<br>&lt;A NAME=&quot;01&quot;&gt;&lt;B&gt;*&lt;/B&gt;&lt;/A&gt;  -  В настоящей статье под &lt;B&gt;&quot;удаленным соединением&quot;&lt;/B&gt; подразумевается подключение к интернет-провайдеру по телефонной сети с помощью модема.<br>&lt;BR&gt;(&lt;A HREF=&quot;#_01&quot;&gt;вернуться&lt;/A&gt;)<br>&lt;P&gt;&lt;/P&gt; <br>&lt;A NAME=&quot;02&quot;&gt;&lt;B&gt;**&lt;/B&gt;&lt;/A&gt;  -    Далее под &quot;библиотечной функцией&quot; будем понимать функцию библиотеки &lt;B&gt;rasapi32.dll&lt;/B&gt;<br>&lt;BR&gt;(&lt;A HREF=&quot;#_02&quot;&gt;вернуться&lt;/A&gt;)<br>&lt;P&gt;&lt;/P&gt; <br>&lt;A NAME=&quot;03&quot;&gt;&lt;B&gt;***&lt;/B&gt;&lt;/A&gt;  -  Для не посвященных в дебри программирования от Microsoft.&lt;BR&gt;<br>CallBack-функция - это функция &quot;обратного вызова&quot;. Служит для обработки некоторых функций и процедур созданных компанией Microsoft. В Pascal&#39;е не применяется. С CallBack-функциями приходится часто сталкиваться при попытках программирования внутри Delphi на API (Application Programming Interface - интерфейс программирования приложений). К чему такие сложности? Не знаю. Возможно это такой стиль программирования от Microsoft. J<br>&lt;BR&gt;Т.к. в нашем примере возвращать никаких &quot;CallBack-данных&quot; не требуется, поэтому вместо CallBack-функции определим CallBack-процедуру, да простит меня за это Билл Гейтс (кто не знает - это отец-основатель Microsoft). Библиотечная функция RasDial, вызывая эту процедуру помещает в переменную state код состояния соединения.<br>&lt;BR&gt;(&lt;A HREF=&quot;#_03&quot;&gt;вернуться&lt;/A&gt;)<br>&lt;P&gt;&lt;/P&gt; <br>&lt;A NAME=&quot;04&quot;&gt;&lt;B&gt;****&lt;/B&gt;&lt;/A&gt;  -  Stdcall - это способ передачи данных через стек CPU (справа - налево). Зарезервированное слово stdcall необходимо применять при обращении к находящимся в DLL (Dynamic Link Library - динамически подключаемая библиотека) процедурам и функциям, написанных на другом языке программирования - это из Help&#39;а. Я однажды забыл указать этот параметр при обращении к DLL написанной на Pascal и в результате &quot;подвесил&quot; компьютер. Поэтому, всегда при обращении к библиотекам указывайте - stdcall.<br>&lt;BR&gt;(&lt;A HREF=&quot;#_03&quot;&gt;вернуться&lt;/A&gt;)<br>&lt;P&gt;&lt;/P&gt; <br>&lt;A NAME=&quot;05&quot;&gt;&lt;B&gt;*****&lt;/B&gt;&lt;/A&gt;  -  Это для того, чтобы в процессе соединения с сервером наше приложение могло реагировать на сообщения Windows, например, на нажатие кнопок.<br>&lt;BR&gt;(&lt;A HREF=&quot;#_05&quot;&gt;вернуться&lt;/A&gt;)<br>&lt;P&gt;&lt;/P&gt;<br>[/doHTML]]]></description>
        <author>Song</author>
        <category>Интернет, сети, протоколы</category>
      </item>
	
      </channel>
      </rss>
	