Главная > Программирование > Языки Pascal/Delphi > |
RU.DELPHI.INTERNET FAQ |
Секция 2 из 2 - Предыдущая - Следующая
begin FLastActivity := Now; FInterpreter.InterpretData(Data); Data := nil; FLastActivity := Now; end; end; WAIT_OBJECT_0 + 1: while PeekMessage(msg, 0, 0, 0, PM_REMOVE) do DispatchMessage(msg); WAIT_TIMEOUT: if (FTimeout > 0) and ((Now - FLastActivity) > FTimeout) then FTransport.Connected := False; end; except FTransport.Connected := False; end; finally FInterpreter.Free; FInterpreter := nil; end; finally FTransport := nil; end; finally CoUninitialize; Synchronize(RemoveClient); end; end; { TSocketDispatcher } constructor TSocketDispatcher.Create(AOwner: TComponent); begin inherited Create(AOwner); ServerType := stThreadBlocking; OnGetThread := GetThread; end; procedure TSocketDispatcher.GetThread(Sender: TObject; ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread); begin SocketThread := TSocketDispatcherThread.Create(Self, False, ClientSocket, InterceptGUID, Timeout, RegisteredOnly); end; end. ------------------------------------------------------------ Q-17: Как пеpесылать файл чеpез nonBlocking socket? ------------------------------------------------------------ а форме ServerSocket1, ClientSocket1 : (Active := False, Host := localhost, Port := 2001, xType := xNonBlocking), OpenDialog1, Button1, Memo1. procedure TfmMain.FormCreate(Sender: TObject); begin ServerSocket1.Active:=true; ClientSocket1.Active:=true; end; {--- Server ---} procedure TfmMain.Button1Click(Sender: TObject); var sStream : TMemoryStream; begin sStream := TMemoryStream.Create; if not OpenDialog1.Execute then Exit; sStream.LoadFromFile(OpenDialog1.FileName); ServerSocket1.Socket.Connections[0].SendStreamThenDrop(sStream); end; {--- Client ---} const MAX_BUF_SIZE = $4095; var fStream: TFileStream; {OnConnect} procedure TfmMain.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin fStream:= TFileStream.Create('Receive.fil', fmCreate); end; {OnRead} procedure TfmMain.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var count :Integer; buffer: Array [0..MAX_BUF_SIZE] of Char; begin repeat Socket.Lock; count:= Socket.ReceiveBuf(buffer,SizeOf(buffer)); if count > 0 then fStream.WriteBuffer(buffer,count); Socket.Unlock; until (count <= 0); Memo1.Lines.Add(IntToStr(fStream.Size)); end; {OnDisconnect} procedure TfmMain.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); begin fStream.Free; end; ------------------------------------------------------------ Q-18: Хочу получать информацию о дате и времени из Internet. ------------------------------------------------------------ Вам помогут компоненты TNMDayTime и TNMTime, которые (согласно RFC867 и RFC868 соответственно) и предназначены для этих целей. ------------------------------------------------------------ Q-19: При запросе по неверному адресу компонент TNMHTTP виснет или вылетает. Что делать? ------------------------------------------------------------ Обработать событие OnFailure. ------------------------------------------------------------ Q-20: Мне надо закодировать данные в UUE (MIME) код. ------------------------------------------------------------ Компонент TNMUUProcessor станет Вашим хорошим помощником. Если Вам не хочется использовать компоненты от NetMasters, попробуйте Indy. Информацию о данном наборе компонент можно найти в этом FAQ. о! При получении писем (атачей) в кoдировке UUE компоненты из библиотеки Indy работают не очень корректно. а http://www.rtfm.be/fpiette можно найти нужный файл pop3cli.zip. DK: Можно также почитать о MIME в RFCs 2045-2049 ------------------------------------------------------------ Q-21: Компоненты на странице FastNet глючат! ------------------------------------------------------------ Попробуйте набор компонент Internet Direct - Indy. Взять его можно на http://www.nevrona.com/indy ------------------------------------------------------------ Q-22: Хочу организовать чат. Как? ------------------------------------------------------------ В подкаталоге DEMOS\INTERNET\CHAT есть пример чата. ------------------------------------------------------------ Q-23: Ассинхронная ошибка. ------------------------------------------------------------ Вопрос: Почему не работает следующий код? begin ClietnSocket1.Open; if ClietnSocket1.Socket.Connected then ClietnSocket1.Socket.SendText('Hello'); {..} end; Выдает - ассинхронная ошибка. Вы работаете в ассинхронном режиме. Следует использовать соответсвующие события. ------------------------------------------------------------ Q-24: Я слышал, что Delphi позволяет писать CGI-приложения. Так ли это? ------------------------------------------------------------ Да, действительно, Delphi позволяет создавать CGI-приложения трех видов: * Stand-alone CGI (EXE) * Win-CGI (EXE) * ISAPI/NSAPI dynamic link library (DLL) Рассмотрим их подробнее. Обычное CGI-приложение получает необходимую информацию через переменные окружения и STDIN, а выводит - через STDOUT. Понятно, что это в условиях Windows не очень удобно, зато 100% работает с любым сервером под Windows, который поддерживает CGI. Win-CGI приложение отличается тем, что информация передается через INI-файл, а выводится в файл, который затем сервер передает в ответ на запрос. ISAPI/NSAPI Dll (Internet Services API - Microsoft Server)/(Netscape Services API - Netscape Server) работает как обычная dll. Она загружается в адресное пространство сервера. Каждый запрос обрабатывается в отдельном потоке. Сия dll должна экспортировать три функции - GetExtensionVersion, HttpExtensionProc и TerminateExtension. Основа этих приложений - классы TCGIApplication (для CGI и WinCGI) и TISAPIApplication. Сам процесс написания CGI-приложения на Delphi достаточно подробно описан в help'е. ------------------------------------------------------------ Q-25: Как мне отлаживать CGI-приложение? ------------------------------------------------------------ Во-первых, Вам необходим установленный WEB-сервер. Для Stand-Alone CGI приложений достаточно любого сервера. Я использую Xitami server. ISAPI/NSAPI Dll поддерживаются всеми серверами от Microsoft, Netscape Server 2.0, а также сервером Apache. Во-вторых, это зависит от того, что именно делает Ваша программа. Если она должна предлагать пользователю заполнить некую форму, то Вам нужно создать html-файл, в котором эта форма была бы описана. Описывается форма тэгом <form>: <form name="GB" method="POST" action="http://127.0.0.1/cgi-bin/guestbook.pl"> <!-- здесь описываете содержание формы --> </form> Контролы на форму помещаются тэгом <input>: <input type="*тип_контрола*" name="*имя_контрола*" [checked] value="*значение*" [size="*размер*"> Для того, чтобы получить нужный контрол, см. значения свойства type в следующей таблице: TEdit text TCheckBox checkbox TRadioButton radio TButton submit Для получения контрола типа TComboBox существует тэг <select>, внутри которого тэгом <option> задается каждый пункт списка: <select name="*имя_контрола*"> <option value="*Значение0*" [selected]>Текст0 <option value="*Значение1*">Текст1 <!-- .. --> <option value="*ЗначениеN*">ТекстN </option></select> Для получение контрола типа TMemo cуществует тэг <textarea>: <textarea name="*имя_контрола*" rows="*количество_видимых_строк*" cols="*количество_видимых_столбцов*"> Текст, который по умолчанию будет в контроле </textarea> Более подробную информацию о тэгах Вы можете получить, обратившись к соответствующим источникам. Далее напускаете Ваш браузер на эту страницу. Вводите тестовые значения и нажимаете кнопку подтверждения, после чего сервер запустит Ваше приложение. Если Вам не надо обрабатывать формы, то просто укажите Вашему браузеру URL следующего вида: http://127.0.0.1/cgi-bin/yourscript.exe/action?param0=value0¶m1=value1 Слово 'action' означает имя одного из компонентов в списке TWebModule.Actions[Index: Integer]: TWebAction. Параметры, следующие после вопросительного знака, также необязательны. Если же они есть, то будут помещены после декодирования в свойство TWebRequest.QueryFields: TStrings и в виде целой строки - в свойство TWebRequest.Query: String. Параметр Request:TWebRequest передается в обработчик события OnAction компонента TWebAction. Также можно отлаживать CGI-приложение прямо в IDE любым из следующих способов: 0. Достаточно запустить CGI-приложение один раз под управлением http демона. Выведите список переменных среды куда-нибудь - в файл или прямо в качестве ответа клиенту. Это понадобится исключительно с информационной целью, для справки. На самом деле, для большинства тестов достаточно только тех установок переменных окружения, которые непосредственно используются в тестируемой вами части программы. В большинстве случаев достаточно установить три переменные PATH_INFO, QUERY_STRING, METHOD. Это можно сделать прямо внутри среды (Kylix - Project/Parameters, Delphi 6 - Tools\Environment options) и запускать приложение из среды. Расставьте точки останова и наслаждайтесь созерцанием собственных ошибок. 2. Только для Windows. Где-нибудь в тексте программы можно в самом начале установить вывод на экран сообщения посредством функции Windows API MessageBox. Важно, чтобы один из параметров включал в себя MB_SERVICE_NOTIFICATION. Запустите CGI приложение штатным способом - браузер/http сервер/CGI. Сразу после запуска программы, когда выполнение дойдет до вызова MessageBox на дисплее появится окошко с сообщением. Теперь можно присоединяться к процессу, представляющего вашу CGI-программу из IDE - Run|Attach to process... Нажмите кнопочку на сообщении, выданном CGI-приложением и продолжайте выполнение, но уже под управлением отладчика среды. Возможно, что нечто подобное покатит и для Linux'а. Там, разумеется, будет не MessageBox с MB_SERVICE_NOTIFICATION, а что-нибудь другое. ------------------------------------------------------------ Q-26: Мое CGI-приложение при обращении к нему ничего не возвращает. Что делать? ------------------------------------------------------------ Вопрос: Мое CGI-приложение при обращении к нему, имеющим вид, например, http://127.0.0.1/cgi-bin/mycgi.exe ничего не возвращает. Что делать? Установите свойство TWebAction.Default: Boolean в true для той Action из списка, которая должна по обрабатывать запросы тогда, когда это не делает ни одна из других Actions. ------------------------------------------------------------ Q-27: Бардак с кириллицей в параметрах CGI запроса ------------------------------------------------------------ Вопрос: Я хочу реализовать регистрацию своей программы через Internet. Для этого я вызываю CGI-скрипт, которому в качестве параметра передается имя пользователя. Однако, если имя набрано кириллицей, происходит ошибка. В чем дело? Дело в том, что при передаче запроса по протоколу HTTP служебные символы и символы с кодами 128..255 надо кодировать. То есть, если пользователь ввел имя 'Вася Пупкин', то запрос для регистрации должен выглядеть не так: http://site/cgi-bin/reg.pl?user=Вася Пупкин а вот так: http://site/cgi-bin/reg.pl?user=%C2%E0%F1%FF+%CF%F3%EF%EA%E8%ED Решить проблему перекодировки туда и обратно может компонент TNMURL. DK: В Делфи в стандартной поставке есть функции для [де]кодирования URL'а: модуль httpapp, ф-ции HTTPEncode и HTTPDecode. Дополнительную информацию про кодирование URL'ов, можно прочитать в RFC1738 ------------------------------------------------------------ Q-28: Как отправить письмо, с помощью клиента по умолчанию? ------------------------------------------------------------ В разделе uses ShellAPI. В обработчике OnClick метки или клавиши ввести следующий код. ShellExecute(Handle,'open','mailto:lalala@lala.ru',nil,nil,SW_SHOWNORMAL); ------------------------------------------------------------ Q-29: Как открыть страничку с помощью браузера по умолчанию? ------------------------------------------------------------ В разделе uses ShellAPI. В обработчике OnClick метки или клавиши ввести следующий код. ShellExecute(Handle,'open','http://faq.delphiplus.org',nil,nil,SW_SHOWNORMAL); ------------------------------------------------------------ Q-30: Как отправить письмо я знаю, а как указать тему, текст сообщения? ------------------------------------------------------------ Для отправки письма с помощью зарегистрированого клиента используется функция Windows - ShellExecute, где в качестве аргумента передается строка протокола Mailto. Для этого сделайте следующее. по В разделе uses ShellAPI. В обработчике OnClick метки или клавиши ввести следующий код. ShellExecute(Handle,'open','mailto:lalala@lala.ru?par1=value1&par1=value1&...',nil,nil,SW_SHOWNORMAL); Что здесь делается 1. Вызывается функция ShellExecute, где третий параметр - это строка в соответствии с протоколом mailto и правилами оформления URL mailto: - тип протокола (может быть http: в этом случае оставшая URL и параметры запроса). lalala@lala.ru - адрес получателя, можно включать несколько адресов, разделяя из символом ";" ? - разделитель параметров от адреса par1=value1 - имя параметра и его значение & - разделитель параметров Протокол Mailto имеет следующую форму. MAILTO:Recipients&Parameters Поле Recipients может быть пустым, одиночным адресом и состоять из нескольких адресов, разделенных символом ";". Поле Parameters дополнительно и если оно есть то должно быть отделено символом "&". Параметры должны появляться в форме пары name/value. Следующий список описывает возможные параметры: PARAMETER DESCRIPTION CC= Carbon copy (дополнительные получатели) BCC= Blind carbon copy (дополнительные получатели, адреса которых не показываются остальным получателям) SUBJECT= Subject text (тема) BODY= Body text (текст) Все данные указываемые в параметрах должны быть так называемые Internet safe characters. Используййте %0d для символа перевод строки (LF), %20 для пробела и так далее. Пример: mailto:email1;email2?cc=email3&subject=Это%20тема&body=это%20текст%20письма%0dЭто%20другая%20строка ------------------------------------------------------------ Q-31: Как узнать IP машины по имени? ------------------------------------------------------------ uses WinSock; const WINSOCK_VERSION = $0101; function GetIPAddress(Name:String): string; var WSAData : TWSAData; p : PHostEnt; begin WSAStartup(WINSOCK_VERSION, WSAData); p := GetHostByName(PChar(Name)); Result := inet_ntoa(PInAddr(p.h_addr_list^)^); WSACleanup; end; ------------------------------------------------------------ Q-32: Как из ActiveX запросить другую страницу в браузере? ------------------------------------------------------------ Смотрите urlmon.pas -> HLinkNavigateString. К сожалению, это пройдет только под Internet Explorer. ------------------------------------------------------------ Q-33: Какая реализация у ICQ и других Internet-пейджеров? ------------------------------------------------------------ Описание протокола: http://sophocles.mscom.ru/icq/ API: http://www.icq.com/api/ ------------------------------------------------------------ Q-34: Как у TWebBrowser отключить контекстное меню от правой кнопки мыши? ------------------------------------------------------------ http://www.compress.ru/Article.asp?id=1127 ------------------------------------------------------------ Q-35: Как узнать домен, к которому я в данный момент подключен? Используется WinNT. ------------------------------------------------------------ Использовать функцию NetWkstaUserGetInfo, при этом учитывая две вещи: 0. The set of ported LAN Manager functions supported by MicrosoftR WindowsR is based on the set of LAN Manager functions specified in the LAN Manager 2.x Programmer's Reference. They are not a part of the MicrosoftR Win32R application programming interface (API). Certain LAN Manager functions are obsolete. Other LAN Manager functions have been superseded. In addition, the MicrosoftR Windows NTR operating system adds to the set of networking functions introduced by LAN Manager. 1. В Delphi 5 ЕТ хедера с прототипом этой функции. Поэтому придется ее импортировать самому. ------------------------------------------------------------ Q-36: Как из своей программы вызвать диалог изменения настроек Internet? ------------------------------------------------------------ uses ShellApi; {...} ShellExecute(0, 0, 'inetcpl.cpl',...); ------------------------------------------------------------ Q-37: Как определить наличие соединения c Internet? ------------------------------------------------------------ Следует подключить модуль WinInet.pas, в котором есть замечательная функция InternetGetConnectedState... Кстати, в этом модуле имеются заголовки еще массы других полезных функций. Предложение от Анатолия Подгорецкого The easiest way to find out if and how (proxy, ras...) you are connected to the Internet, without the overhead of installing components, is the following: ------------------------> Snippet USES WinInet; .. function InternetConnected: Boolean; { INTERNET_CONNECTION_MODEM = 1; // local system uses a modem to connect to the Internet. INTERNET_CONNECTION_LAN = 2; // local system uses a local area network to connect to the Internet. INTERNET_CONNECTION_PROXY = 4; // local system uses a proxy server to connect to the Internet. INTERNET_CONNECTION_MODEM_BUSY = 8; // local system's modem is busy with a non-Internet connection. } VAR dwConnectionTypes : DWORD; BEGIN dwConnectionTypes := INTERNET_CONNECTION_MODEM + INTERNET_CONNECTION_LAN + INTERNET_CONNECTION_PROXY; Result := InternetGetConnectedState(@dwConnectionTypes,0); END; <-------------------- Snippet dwConnectiontype holds the appropriate flags after the call. This snippet comes from http://inner-smile.com/delphit2.htm ------------------------------------------------------------ Q-38: Могут ли передаваться данные из html-страницы в программу (через TWebBrowser)? ------------------------------------------------------------ Могyт. Подpобнее и с пpимеpами - зайди на стpаницy http://www.calm.hw.ac.uk/davidf/papers/htmldlg.htm или http://sca.uwaterloo.ca/www.calm.hw.ac.uk/davidf/papers/htmldlg.htm ------------------------------------------------------------ Q-39: Почему при использовании метода TWebBrowser.Navigate нужно указывать полное имя файла? ------------------------------------------------------------ В соответствии с RFC 1808 браузер должен обрабатывать URL вида [[[[протокол://]сервер]/][путь/]]страница Если какая-то часть пропущена, браузер должен взять недостающее из текущей страницы, или текущего URL, или из твоего приложения. Поэтому, для загрузки файлов с локальных дисков нужно передавать методу TWebBrowser.Navigate следующее: file:///диск:/путь/имя-файла ------------------------------------------------------------ Q-40: Как хранить web-страницы внутри файла? ------------------------------------------------------------ На сайте http://www.diagnostic.ru/delphi опубликована статья "Сайт внутри EXE файла". ------------------------------------------------------------ Q-41: Как определить свой IP адрес? ------------------------------------------------------------ uses WinSock; function GetLocalIP: String; const WSVer = $101; var wsaData: TWSAData; P: PHostEnt; Buf: array [0..127] of Char; begin Result := ''; if WSAStartup(WSVer, wsaData) = 0 then begin if GetHostName(@Buf, 128) = 0 then begin P := GetHostByName(@Buf); if P <> nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^); end; WSACleanup; end; end; ------------------------------------------------------------ Q-42: Как с помощью Indy работать с Socks Proxy? ------------------------------------------------------------ Ответ для Indy9. а форму поместить TIdTCPClient, TIdIOHandlerSocket, TIdSocksInfo, установить необходимые параметры, связать между собой: TIdTCPClient.IOHandler := IdIOHandlerSocket1; IdIOHandlerSocket.SocksInfo := IdSocksInfo1; и, в принципе, все. FAQmaker> если кто-то может дать более развернутый ответ на этот FAQmaker> вопрос, то, пожалуйста, отправьте мне его по e-mail - FAQmaker> будет использовано при обновлении FAQ ------------------------------------------------------------ Q-43: Ищу исходники WEB-сервера на Object Pascal ------------------------------------------------------------ www.ritlabs.com ------------------------------------------------------------ Q-44: Как в TWebBrowser организовать изменение размера шрифта? ------------------------------------------------------------ procedure TWebBrowserXXX.SetFontSize(nSize: OleVariant); begin if (nSize >= 0) and (nSize <= 4) then ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, nSize) end; ------------------------------------------------------------ Q-45: Как перед активацией сокета определить, занят ли на данной машине нужный порт? ------------------------------------------------------------ var SockAddrIn : TSockAddrIn; FSocket : TSocket; ... If bind(FSocket, SockAddrIn, SizeOf(SockAddrIn)) <> 0 Then begin обрабатываем WSAGetLastError end; ------------------------------------------------------------ Q-46: Как скачать файл, используя proxy? ------------------------------------------------------------ DownloadFile('http://some.com/some.zip', 'c:\some.zip'); function DownloadFile(const FileURL, FileName: String): Cardinal; var hSession, hFile: HInternet; Buffer: array[1..1024] of Byte; BufferLen, fSize: LongWord; f: File; begin Result := 0; hSession := InternetOpen('STEROID Download', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); if Assigned(hSession) then begin hFile := InternetOpenURL(hSession, PChar(FileURL), nil, 0, INTERNET_FLAG_RELOAD, 0); if Assigned(hFile) then begin AssignFile(f, FileName); Rewrite(f,1); fSize := 0; repeat InternetReadFile(hFile, @Buffer, SizeOf(Buffer), BufferLen); BlockWrite(f, Buffer, BufferLen); fSize := fSize + BufferLen; until (BufferLen = 0); CloseFile(f); Result := fSize; InternetCloseHandle(hFile); end; InternetCloseHandle(hSession); end; end; Комментарий: function InternetOpen(lpszAgent: PChar; dwAccessType: DWORD; lpszProxy, lpszProxyBypass: PChar; dwFlags: DWORD): HINTERNET; stdcall; lpszAgent строка символов, которая передается серверу и идентифицирует программное обеспечение, пославшее запрос. dwAccessType INTERNET_OPEN_TYPE_DIRECT : обрабатывает все имена хостов локально. INTERNET_OPEN_TYPE_PRECONFIG : берет установки из реестра. INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY - берет установки из реестра и предотвращает запуск Jscript или Internet Setup (INS) файлов. ! INTERNET_OPEN_TYPE_PROXY : использование прокси-сервера. В случае неудачи использует INTERNET_OPEN_TYPE_DIRECT. LpszProxy - адрес прокси-сервера. Игнорируется только если параметр dwAccessType отличается от INTERNET_OPEN_TYPE_PROXY. LpszProxyBypass - список имен или IP- адресов, соединяться с которыми нужно в обход прокси-сервера. В списке допускаются шаблоны. Так же, как и предыдущий параметр, не может содержать пустой строки. Если dwAccessType отличен от INTERNET_OPEN_TYPE_PROXY, то значения игнорируются, и параметр можно установить в nil. DwFlags задает параметры, влияющие на поведение Internet- функций. Возможно применение комбинации из следующих разрешенных значений: INTERNET_FLAG_ASYNC, INTERNET_FLAG_FROM_CACHE, INTERNET_FLAG_OFFLINE. ------------------------------------------------------------ Q-47: Как перед скачиванием узнать размер файла? ------------------------------------------------------------ GetUrlInfo(HTTP_QUERY_CONTENT_LENGTH, 'http://some.com/some.zip'); function GetUrlInfo(const dwInfoLevel: DWORD; const FileURL: string): string; var hSession, hFile: hInternet; dwBuffer: Pointer; dwBufferLen, dwIndex: DWORD; begin Result := ''; hSession := InternetOpen('STEROID Download', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); if Assigned(hSession) then begin hFile := InternetOpenURL(hSession, PChar(FileURL), nil, 0, INTERNET_FLAG_RELOAD, 0); dwIndex := 0; dwBufferLen := 20; if HttpQueryInfo(hFile, dwInfoLevel, @dwBuffer, dwBufferLen, dwIndex) then Result := PChar(@dwBuffer); if Assigned(hFile) then InternetCloseHandle(hFile); InternetCloseHandle(hsession); end; end; ------------------------------------------------------------ Q-48: Можно ли как-нибудь обеспечить стабильную работу на машинах со старыми версиями WinInet? ------------------------------------------------------------ Еще кое-какой код, который может оказаться полезным в плане обеспечения стабильной работы на машинах со старыми версиями wininet.dll или вообще отсутствия оной. var WinInetDLL: THandle =0; _InternetOpenA: function(lpszAgent: PAnsiChar; dwAccessType: DWORD; lpszProxy, lpszProxyBypass: PAnsiChar; dwFlags: DWORD): HINTERNET; stdcall; _InternetOpenURLA: function(hInet: HINTERNET; lpszUrl: PAnsiChar; lpszHeaders: PAnsiChar; dwHeadersLength: DWORD; dwFlags: DWORD; dwContext: DWORD): HINTERNET; stdcall; _InternetReadFile: function(hFile: HINTERNET; lpBuffer: Pointer; dwNumberOfBytesToRead: DWORD; var lpdwNumberOfBytesRead: DWORD): BOOL; stdcall; _InternetCloseHandle: function(hInet: HINTERNET): BOOL; stdcall; procedure InitWinInet; var OldError: Longint; begin OldError := SetErrorMode(SEM_NOOPENFILEERRORBOX); try if WinInetDLL = 0 then begin WinInetDLL := LoadLibrary('wininet.dll'); if WinInetDLL <> 0 then begin @_InternetOpenA := GetProcAddress(WinInetDLL,'InternetOpenA'); @_InternetOpenURLA := GetProcAddress(WinInetDLL,'InternetOpenUrlA'); @_InternetReadFile := GetProcAddress(WinInetDLL,'InternetReadFile'); @_InternetCloseHandle := GetProcAddress(WinInetDLL,'InternetCloseHandle'); end; end; finally SetErrorMode(OldError); end; end; ... if WinInetDLL = 0 then InitWinInet; if WinInetDLL <> 0 then begin ... end else ShowMessageUser('Не могу загрузить WinInet.dll'); ...
Секция 2 из 2 - Предыдущая - Следующая
Вернуться в раздел "Языки Pascal/Delphi" - Обсудить эту статью на Форуме |
Главная - Поиск по сайту - О проекте - Форум - Обратная связь |