Monday, August 23, 2010

Введение в WinInet

Ещё вчера Вы даже и не думали о написании программ, использующих интернет протоколы, полагая, что это удел web-программистов. Но, уже сегодня перед Вами стоит задача прочитать/записать, передать/принять, получить/послать что-либо из своей программы на какой-либо интернет-сервер. Какие средства для этого существуют? Сколько времени уйдёт на их изучение и эксперименты? Давайте рассмотрим один из способов, который позволяет решать большинство подобных задач в максимально короткие сроки.
Win32 Internet Extensions, или WinInet, представляет собой API для доступа к общим протоколам интернет, включая FTP, HTTP и Gopher. Это высокоуровневый API, позволяющий, в отличие от WinSock или TCP/IP, не заботиться о деталях реализации соответствующих интернет протоколов. Всего API содержит чуть менее сотни функций на все случаи жизни, но нам для начала работы с WinInet потребуется не более десятка.
Необходимый минимум
Рассмотрим простейший пример, позволяющий читать WWW страницу с заданного HTTP сервера. Общий алгоритм работы может быть следующим:

InternetOpen
 InternetConnect
   HttpOpenRequest
     HttpSendRequest
     InternetReadFile
   InternetCloseHandle
 InternetCloseHandle
InternetCloseHandle
Функции WinInet API
Разберём все функции по порядку и рассмотрим только те параметры, которые нам будут необходимы.
InternetOpen
Эта функция инициализирует WinInet и возвращает дескриптор, который необходим для вызова других функций WinInet. В случае неудачи возвращается NULL. Более подробную информацию об ошибке можно получить, вызвав функцию GetLastError, которая возвращает один из кодов, определённых в файле wininet.h.

HINTERNET WINAPI InternetOpen(
   LPCTSTR lpszAgent,
   DWORD dwAccessType,
   LPCTSTR lpszProxyName,
   LPCTSTR lpszProxyBypass,
   DWORD dwFlags
);
Read more: RSDN