Для начала, рассмотрим функции, необходимые для работы:
Dial-Up
InternetAutodial
Как сказано на msdk, "Causes
the modem to automatically dial the default Internet connection", у меня просто
вызывал диалог подключения InternetAutodial( dwFlags:Cardinal; hwndParent:hWnd
):BOOLEAN;
Параметры
dwFlags Параметры операции. Принимает
следующие значения:
INTERNET_AUTODIAL_FAILIFSECURITYCHECK
INTERNET_AUTODIAL_FORCE_ONLINE INTERNET_AUTODIAL_FORCE_UNATTENDED
hwndParent Handle окна Возвращает TRUE при успешном результате, FALSE в
противном случае.
InternetAutodialHangup
Отсоединяет модем от
линии. InternetAutodialHangup( dwReserved:Cardinal ):BOOLEAN;
Параметры
dwReserved Зарезервировано. Должно быть 0. Возвращает TRUE при успешном
результате, FALSE в противном случае.
InternetGetConnectedState
Возвращает состояние соединения InternetGetConnectedState( var
lpdwFlags:Cardinal; dwReserved:Cardinal ):BOOLEAN;
Параметры
lpdwFlags Свойства соединения. Флаги:
INTERNET_CONNECTION_CONFIGURED INTERNET_CONNECTION_LAN
INTERNET_CONNECTION_MODEM INTERNET_CONNECTION_MODEM_BUSY
INTERNET_CONNECTION_OFFLINE INTERNET_CONNECTION_PROXY
INTERNET_RAS_INSTALLED dwReserved Зарезервировано. Должно быть 0.
Возвращает TRUE при успешном результате, FALSE в противном случае.
Работа с интернет
InternetOpen
Инициализирует соединение
с интернет. InternetOpen( lpszAgent:PChar; dwAccessType:Cardinal;
lpszProxyName:PChar; lpszProxyBypass:PChar; dwFlags:Cardinal ):hInternet;
Параметры
lpszAgent строка символов, которая передается серверу
и сообщает ему название программы, пославшей запрос dwAccessType Параметры
доступа. Принимает следующие значения:
INTERNET_OPEN_TYPE_DIRECT
обрабатывает локально имена host'ов INTERNET_OPEN_TYPE_PRECONFIG параметры
берутся из реестра INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY параметры
также берутся из реестра и предотвращает запуск JScript и Internet Setup (INS)
файлов INTERNET_OPEN_TYPE_PROXY использовать указанный прокси лист, если не
получилось, то используется INTERNET_OPEN_TYPE_DIRECT (прямое соединение с
сервером) lpszProxyName Указатель на строку, содержащую адрес прокси
сервера, или их лист. Используется только если есть параметр
INTERNET_OPEN_TYPE_PROXY. lpszProxyBypass Указатель на строку содержащей host'ы,
или IP адреса, с которыми не должен использоваться прокси сервер dwFlags
Параметр- флаги, влияющие на поведение функции. Возможны комбинации констант:
INTERNET_FLAG_ASYNC INTERNET_FLAG_FROM_CACHE
INTERNET_FLAG_OFFLINE Возвращает описатель, который позволяет
использовать интернет функции в Вашей программе. Полученный описатель должен
быть освобожден после спользования функций с помощью InternetCloseHandle. Вы
можете несколько раз вызывать эту функцию в своей программе, но все они должны
быть освобождены после(например, для разных прокси серверов). Если функция не
успешна, то возвращается nil.
InternetCloseHandle
Закрывает
описатель интернет соединения InternetCloseHandle( HINT:hInternet ):BOOLEAN;
Параметры
hInternet hInternet описатель, который следует закрыть
Возвращает TRUE если описатель успешно закрыт и FALSE в противном случае
InternetConnect
Открывает FTP, Gopher, или HTTP сессию для
данног файла сайта InternetConnect( HINT:hInternet; lpszServerName:PChar;
nServerPort:INTERNET_PORT; lpszUserName:PChar; lpszPassword:PChar;
dwService:Cardinal; dwFlags:Cardinal; dwContext:PCardinal ):hInternet;
Параметры
hInternet hInternet описатель, полученный от вызова
InternetOpen lpszServerName Указатель на строку, содержащую имя host'а интернет
сервера, или IP адрес сайта формата a.b.c.d(например, 255.0.0.0) nServerPort
Номер TCP/IP порта, через который будет установлена связь с сервером. Вы можете
использовать следующие константы
INTERNET_DEFAULT_FTP_PORT Стандартный
порт для FTP сервера (порт 21) INTERNET_DEFAULT_GOPHER_PORT Стандартный порт
для Gopher сервера (порт 70) INTERNET_DEFAULT_HTTP_PORT Стандартный порт для
HTTP сервера (порт 80) INTERNET_DEFAULT_HTTPS_PORT Стандартный порт для
HTTPS сервера (порт 443) INTERNET_DEFAULT_SOCKS_PORT Стандартный порт для
SOCKS firewall сервера (порт 1080) INTERNET_INVALID_PORT_NUMBER Использовать
стандартный порт, для службы определенной параметром dwService. lpszUsername
Указатель на строку, содержащую имя пользователя lpszPassword Указатель на
строку, содержащую пароль dwService Тип сервиса
INTERNET_SERVICE_FTP FTP
сервис INTERNET_SERVICE_GOPHER Gopher сервис INTERNET_SERVICE_HTTP HTTP
сервис dwFlags Специальные параметры для соединения. dwContext Установите в
0. Возвращает описатель соединения с сервисом если соединение прошло успешно,
nil в противном случае Таблица описывает поведение для 4 возможных установок
параметров lpszUsername и lpszPassword
lpszUsername lpszPassword Имя
пользователя Пароль, отсылаемый на FTP сервер nil nil "anonymous" E-mail
пользователя Не нулевая строка nil lpszUsername "" nil Не нулевая строка
Ошибка Ошибка Не нулевая строка Не нулевая строка lpszUsername lpszPassword
InternetOpenUrl
Чтение файла с данным URL должно начаться с этой
функции. InternetOpenUrl( HINT:hInternet; lpszUrl:PChar; lpszHeaders:PChar;
dwHeadersLength:Cardinal; dwFlags:Cardinal; dwContext:PCardinal ):hInternet;
Параметры
hInternet HINT- описатель интернет сессии, полученный
вызовом функции InternetOpen lpszUrl Указатель на строку, содержащую URL файла.
Поддерживаются URL начинающиеся с ftp:, gopher:, http:, или https: lpszHeaders
Указатель на строку, содержащую заголовок запроса HTTP. dwHeadersLength Длина
строки заголовка. Если значение этого параметра -1, то длина вычисляется
автоматически dwFlags Дополнительные параметры. Вы можете использовать следующие
флаги:
INTERNET_FLAG_EXISTING_CONNECT INTERNET_FLAG_HYPERLINK
INTERNET_FLAG_IGNORE_CERT_CN_INVALID
INTERNET_FLAG_IGNORE_CERT_DATE_INVALID
INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP
INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS INTERNET_FLAG_KEEP_CONNECTION
INTERNET_FLAG_NEED_FILE INTERNET_FLAG_NO_AUTH
INTERNET_FLAG_NO_AUTO_REDIRECT INTERNET_FLAG_NO_CACHE_WRITE
INTERNET_FLAG_NO_COOKIES INTERNET_FLAG_NO_UI INTERNET_FLAG_PASSIVE
INTERNET_FLAG_PRAGMA_NOCACHE INTERNET_FLAG_RAW_DATA
INTERNET_FLAG_RELOAD INTERNET_FLAG_RESYNCHRONIZE
INTERNET_FLAG_SECURE dwContext Установите в 0 Возвращает описатель для
FTP, Gopher, или HTTP ссылки если все прошло успешно, или nil в противном случае
Чтобы узнать, почему сервер не дал доступа, вызовите
InternetGetLastResponseInfo.
InternetReadFile
Чтение информации
из описателя, полученного от функций InternetOpenUrl, FtpOpenFile,
GopherOpenFile, или HttpOpenRequest. InternetReadFile( hFile:hInternet;
lpBuffer:Pointer; dwNumberOfBytesToRead:Cardinal; lpdwNumberOfBytesRead:Cardinal
):BOOLEAN;
Параметры
hFile hFile- описатель файла, полученный от
вызова InternetOpenUrl, FtpOpenFile, GopherOpenFile, или HttpOpenRequest
lpBuffer Адрес буфера, в который записываются полученные данные
dwNumberOfBytesToRead Количество байт, которые следует прочитать
lpdwNumberOfBytesRead Количество реально прочитанных байт. Это значение будет
установлено в 0 перед работой, или проверкой ошибок Возвращает TRUE при успешном
завершении и FALSE в противном случае. Информация об ошибках передачи может быть
получена от InternetGetLastResponseInfo
Замечания
Если значение
функции TRUE и количество прочитанных байт 0, то передача файла успешно
завершена(достигнут конец файла)
InternetSetFilePointer
Устанавливает точку чтения для InternetReadFile. Возможно, сервер не
поддерживает возможность. InternetSetFilePointer( hFile:hInternet;
lDistanceToMove:Integer; pReserved:Pointer; dwMoveMethod:Cardinal;
dwContext:Cardinal ):Integer;
Параметры
hFile Описатель файла,
полученный от вызова InternetOpenUrl (для HTTP,или HTTPS URL) или
HttpOpenRequest (метод GET или HEAD). Описатель не должен быть создан со флагом
INTERNET_FLAG_DONT_CACHE или INTERNET_FLAG_NO_CACHE_WRITE lDistanceToMove
Значение, содержащее число байтов для передвижения файлового указателя.
Положительное число означает передвижение вперед, отрицательное- назад.
pReserved Зарезвировано. Установите в nil dwMoveMethod Параметр, указывающий
способ перемещения. Возможно одно из следующих значений:
FILE_BEGIN
Начальная точка- начало файла. Если установлен FILE_BEGIN, то lDistanceToMove
интерпретируется, как положение новой точки чтения от начала. FILE_CURRENT
Текущая точка чтения- точка начала. FILE_END Начальная точка- конец файла.
Если размер файла не известен, то метод не работает dwContext
Зарезервировано. Установите в 0. При успешном выполнении возвращает текущую
позицию(от начала) точки чтения, в противном случае возаращает -1.
Замечания
Функция не может быть использована, если достигнут
конец файла функцией InternetReadFile. Правильная работа функции не
гарантирована, если размер файла не может быть определен. Для нас эта функция
нужна, чтобы использовать возможность возобновления скачивания файлов.
Для получения текста ошибки будем использовать следующую функцию:
function GetErrorText(const FromServer: BOOLEAN):
string; var Msg: array[0..1023] of Char; ErCode, Len:
Cardinal; begin Len := 1023; ZeroMemory(@Msg,
SizeOf(Msg)); if FromServer then if
InternetGetLastResponseInfo(ErCode, @Msg, Len) then Result := 'На
сервере произошла ошибка #' + IntToStr(ErCode) + #13''' + StrPas(@msg) +
'''' else Result := 'Не могу получить описание
ошибки' elseif
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil,
GetLastError, GetKeyboardLayout(0), @Msg, 1023, nil) <> 0
then Result := StrPas(@Msg) else Result := 'Не могу
получить описание ошибки'; end; Если параметр FromServer TRUE, то
код ошибки и её текст берется с сервера, в противном случае берется текст
локальной ошибки.
А теперь простейший пример закачки файла с сервера По
кнопке Button1 происходит закачка. В Edit1 содержится URL файла без префикса
http://
procedure TForm1.Button1Click(Sender:
TObject); var Session, URL: hInternet; F: TFileStream; Q, Fail:
BOOLEAN; Buf: array[1..8192] of Byte; R: Cardinal; begin Fail
:= FALSE;
if SaveDialog1.Execute then begin F
:= TFileStream.Create(SaveDialog1.FileName, fmCreate);
if Session = nil
then begin MessageDlg('Error, InternetOpen: Соединение не
может быть установлено', mtError, [mbOK],
0); exit; end;
URL := InternetOpenURL(Session,
PChar('https://' + Edit1.Text), nil, 0, 0, 0); if URL = nil
then begin MessageDlg('Error, InternetOpenURL: Ссылка не
может быть открыта!', mtError, [mbOK],
0); InternetCloseHandle(Session); exit; end;
R :=
0;
try repeat Q := InternetReadFile(URL, @Buf, 8192,
R); F.Write(Buf, R); until Q and (R = 0) except MessageDlg('Error,
не могу прочитать файл.'#13 + GetErrorText(TRUE), mtError, [mbOK],
0); InternetCloseHandle(Session); InternetCloseHandle(URL); Fail :=
TRUE; end;
if not Fail then ShowMessage('Файл
успешно
скачен.');