Delphi для качков

Лозовский Александр

Xakep, номер #052, стр. 052-074-1

(klouniz@mail.ru)

Любому человеку, мало-мальски знакомому с интернетом, известны такие программы-качалки, как GetRight, Reget и Flashget. Их расплодилось великое множество, все они занимают первые места в рейтингах и продаются за немалые деньги. FlashGet, например, постоянно требует от меня заплатить буржую $29.99 за дальнейшее использование его программы. Все это, конечно, понятно, хочется денег, да побольше... Но разве русский человек может заплатить такую сумму? :) Так что давай сегодня напишем свой Reget, и ты сможешь демонстрировать всем знакомым девушкам свою физиономию в about программы :).

РЕКВИЗИТ

Он нам понадобится. Прошли те времена, когда все делалось в два диалога и одну строчку кода. Нам придется писать программу с использованием функций библиотеки WinInet.dll и заголовочного файла, соответственно, WinInet.Pas. Сразу пропиши его в uses, а то потом забудешь и начнешь тыкаться, искать свою ошибку. Так вот, давай для начала попробуем разобраться с самыми необходимыми функциями, а с остальными ты разберешься сам на msdn.microsoft.com (полный линк давать не буду, т.к. он ОЧЕНЬ большой). Посмотри там следующие функции: InternetDial, InternetGoOnline или InternetCrackUrl (думаю, эта функция тебя должна заинтересовать :)). Но вернемся к реальности. У нас на повестке дня следующие функции:

1) function InternetOpen(lpszAgent: PChar; dwAccessType: DWORD;

lpszProxyName, lpszProxyBypass: PChar; dwFlags: DWORD): HINTEET; stdcall;

Она открывает интернет-сессию для приложения. Вот какие у нее аргументы:

lpszAgent - имя программы. Серьезные люди пишут application.exename, а старики - ParamStr(0). На самом деле это не так важно, программа все равно будет работать.

dwAccessType - способ соединения. Вот его типы:

PRE_CONFIG_INTEET_ACCESS - как в реестре.

INTEET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY - не юзать inteet setup file.

GATEWAY_INTEET_ACCESS - через шлюз.

CE_PROXY_INTEET_ACCESS - через прокси.

lpszProxyName - имя прокси.

lpszProxyBypass - кому не надо использовать проксю.

dwFlags - режим работы. Если ставить INTEET_FLAG_ASYNC, то будет асинхронный. В данном случае это только дополнительный напряг, поэтому ставь 0.

2) function InternetOpenUrl(hInet: HINTEET; lpszUrl: PChar;

lpszHeaders: PChar; dwHeadersLength: DWORD; dwFlags: DWORD;

dwContext: DWORD): HINTEET; stdcall;

Это функция открывает заданный УРЛ! :) Ее описание:

hInet - переменная типа HINTEET. Ее значение возвращает функция InternetOpen.

lpszUrl - собственно сам УРЛ.

lpszHeaders - дополнительные строки в НТТР запросе. Нам они не нужны.

dwHeadersLength - их длина.

dwFlags - их тут больше 10 значений. Вот самое нужное:

INTEET_FLAG_EXISTING_CONNECT - не создавать для объекта нового соединения.

dwContext - пиши 0.

3) function InternetReadFile(hFile: HINTEET; lpBuffer: Pointer;

dwNumberOfBytesToRead: DWORD; var lpdwNumberOfBytesRead: DWORD): BOOL; stdcall;

InternetReadFile читает удаленный файл. Если ты знаком со старой доброй ReadFile (или _lRead), то поймешь сам, а это для тех, кто не знает:

hFile - сюда ты подставляешь значение из предыдущей функции (можно и FtpOpenFile, если тебе это ближе).

Содержание  Вперед на стр. 052-074-2
ttfb: 3.1979084014893 ms