Juri Shutenko Personal Homepage. Visual FoxPro.

Описание функций Windows API с примерами их использования в Visual FoxPro

Переход к описаниям функций
 
InternetGetConnectedState
InternetAttemptConnect
InternetOpen
InternetCloseHandle
InternetConnect
InternetOpenUrl
InternetGetLastResponseInfo

В предыдущей статье были рассмотрены четыре функции, которые необходимы для работы с Internet. В этой статье рассмотрим функции, которые связаны с работой с файлами.

InternetConnect

Функция InternetConnect

Открывает сессию File Transfer Protocol (FTP), Gopher или HTTP для данного сайта.

Declare Integer InternetConnect In WinInet ;
   Integer nInet_Handle, String @lpcServer, Short nPort, String @lpcUserName, ;
   String @lpcPassword, Integer nService, Integer nFlags, Integer nContext

Параметры
 
nInet_Handle
Дексриптор текущей Internet сессии. Дескриптор должен быть получен в результате вызова функции InternetOpen.
 
lpcServer
Указатель на строку с нуль-терминатором, которая определяет имя хоста Интернет сервера. Попеременно строка может содержать IP адрес сайта, в ASCII формате (например, 11.0.1.45).
 
nPort
Порт Transmission Control Protocol/Internet Protocol (TCP/IP) на сервере. Эти флаги устанавливаются только на используемый порт. Сервис устанавливается с помощью значения nService. Этот параметр может одно из приведенных ниже значений.

Символьная константа Dec-значение Описание
INTERNET_DEFAULT_FTP_PORT 21 Использовать порт по-умолчанию для FTP серверов (port 21).
INTERNET_DEFAULT_GOPHER_PORT 70 Использовать порт по-умолчанию для Gopher серверов (port 70).
INTERNET_DEFAULT_HTTP_PORT 80 Использовать порт по-умолчанию для HTTP серверов (port 80).
INTERNET_DEFAULT_HTTPS_PORT 443 Использовать порт по-умолчанию для Secure Hypertext Transfer Protocol (HTTPS) серверов (port 443).
INTERNET_DEFAULT_SOCKS_PORT 1080 Использовать порт по-умолчанию для SOCKS firewall серверов (port 1080).
INTERNET_INVALID_PORT_NUMBER 0 Использовать порт по-умолчанию для сервиса, определеямого с помощью значения nService.

lpcUserName
Указатель на строку с нуль-терминатором, которая определяет имя пользователя для регистрации. Если этот параметр установлен в NULL, то функция использует подходящее по умолчанию значение, за исключениеим случая с HTTP; NULL параметр для HTTP приведет к тому, что сервер вернет ошибку. Для FTP протокола, значением по умолчанию является "anonymous".
 
lpcPassword
Указатель на строку с нуль-терминатором, которая содержит пароль для целей регистрации. Если оба - и lpсPassword, и lpсUsername равны NULL, функция использует дефолтный пароль "anonymous". В случае FTP, дефолтным паролем является имя e-mail пользователя. Если lpcPassword равено NULL, а lpcUsername им не является, функция использует пустой пароль.
 
nService
Тип сервиса для доступа. Этот параметр может иметь одно из приведенных ниже значений.

Символьная константа Dec-значение Описание
INTERNET_SERVICE_FTP 1 FTP сервис.
INTERNET_SERVICE_GOPHER 2 Gopher сервис.
INTERNET_SERVICE_HTTP 3 HTTP сервис.

nFlags
Опции, характерные для используемого сервиса. Если nService равен INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE заставляет приложение использовать семантику пассивного FTP.
 
nContext
Указатель на переменную, которая содержит определяемое приложением значение, которое используется для идентификации контекста приложения для возвращаемого обработчика в обратных вызовах.

Возвращаемые значение
 
Возвращает действительный хэндл к сессии FTP, Gopher или HTTP, если удалось содиниться с сервером; в противно случае вызов функции вернет NULL. Для получения расширенной информации об ошибке нужно вызвать функцию GetLastError. Кроме того, приложение может использовать функцию InternetGetLastResponseInfo для причины - почему доступ к сервису был отклонен.

Примечания
 
В приведенной ниже таблице описываетс поведение для четырех возможных установок параметров lpcUsername and lpcPassword.

lpcUsername lpcPassword Имя пользователя, посылаемое FTP серверу Пароль, посылаемый FTP серверу
NULL NULL "anonymous" Имя e-mail пользователя
Не нулевая строка NULL lpсUsername ""
NULL Не нулевая строка ERROR ERROR
Не нулевая строка Не нулевая строка lpсUsername lpсPassword

Для FTP сайтов, InternetConnect устанавливает реальное соединение с сервером; для других, таких как Gopher, реальное соединение с сервером не устанавливается до тех пор, пока приложение не затребует характерную для соединения транзакцию.

Для обеспечения максимальной эффективности, приложения, использующеме протоколы Gopher и HTTP должны стараться минимизировать вызовы фукнции InternetConnect и избегать вызовов этой функции для каждой транзакции, запрашиваемой пользователем. Одним из путем для осуществления этого является хранения небольшого кэша хэндлов, возвращаемых из вызовов функции InternetConnect; когда пользователь делает запрос к серверам, к которым он ранее получал доступ, это хэндл сессии будет оставаться для него доступным.

После того, как работа приложения, использующего хэндл, полученный в результате вызова InternetConnect, будет завершена, до своего закрытия оно должно закрыть его с помощью функции InternetCloseHandle.

Ниже приведен простой пример использования это функции и полученный результат (см.screenshot)

Declare Integer InternetOpen In WinInet ;
   String lpcAgent, Integer nAccessType, String lpcProxyName, ;
   String lpcProxyBypass, Integer nFlags
Declare Integer InternetCloseHandle In WinInet ;
   Integer nHandle
Declare Integer InternetConnect In WinInet ;
   Integer nInet_Handle, String @lpcServer, Short nPort, String @lpcUserName, ;
   String @lpcPassword, Integer nService, Integer nFlags, Integer nContext
Declare Integer GetLastError In Kernel32

ln_Inet_Handle =;
   InternetOpen(;
   "VisualFoxPro",;
   1, ;
   .Null., ;
   .Null.,;
   0;
   )

ln_Error=GetLastError()
? "Error code is: " 
?? ln_Error

? ln_Inet_Handle
? "Handle from InternetOpen is: " 
?? ln_Inet_Handle

lnSession = ;
   InternetConnect(;
   ln_Inet_Handle,;
   'ftp.microsoft.com', ;
   21, ;
   'anonymous', ;
   'guest', ;
   1,  ;
   0, ;
   0)

ln_Error=GetLastError()
? "Error code is: " 
?? ln_Error

? ln_Inet_Handle
? "Handle for FTP session is: " 
?? lnSession

Wait

InternetCloseHandle(lnSession)
InternetCloseHandle(ln_Inet_Handle)

InternetConnect example

Требования
Клиент Требует использования Windows "Longhorn", Windows XP, Windows 2000 Professional, Windows NT Workstation 4.0, Windows Me, Windows 98 или Windows 95.
Сервер Требует использования Windows Server 2003, Windows 2000 Server или Windows NT Server 4.0
Версия Требуется наличие установленного Internet Explorer 3.0 или более поздних версий.
Заголовки Объявлены в Wininet.h. Упакованный файл заголовков можно взять здесь
DLL Требуется наличие Wininet.dll

InternetOpenUrl

Функция InternetOpenUrl

Открывает ресурс, указанный как полный FTP, Gopher или HTTP унифицированный локатор ресурса (URL).Декларирование функции в Visual FoxPro осуществляется с помощью команды:

DECLARE INTEGER InternetOpenUrl IN wininet; 
   INTEGER hInternet, STRING  lpszUrl,; 
   STRING  lpszHeaders, INTEGER dwHeadersLength,; 
   INTEGER dwFlags, INTEGER dwContext 

Параметры
Функция принимает шесть параметров: hInternet, lpszUrl, lpszHeaders, dwHeadersLength, dwFlags и dwContext, которые описаны ниже
 
hInternet
Дексриптор текущей Internet сессии. Дескриптор должен быть получен в результате вызова функции InternetOpen.
 
lpszUrl
Указатель на строку с терминатором CHR(0), которая определяет URL для начала чтения. Поддерживаются только унифицированные локаторы ресурса, начинающиеся с ftp:, gopher:, http: или https:.
 
lpszHeaders
Указатель на строку с терминатором CHR(0), которая определяет заголовки, которые будут посланы HTTP серверу. Для получения более подробной информации, смотрите описания параметра lpszHeaders в описании функции HttpSendRequest на сайте MSDN корпорации Микрософт.
 
dwHeadersLength
Размер дополнительных заголовков в TCHAR. Если этот параметр равен -1L, а также lpszHeaders не равен NULL, то подразумевается, что lpszHeaders будет zero-terminated (ASCIIZ) и длина рассчитана.
 
dwFlags
Этот параметр может быть установлен в одно из перечисленных в приведенной ниже таблице значений:

Символьная константа Hex-значение Описание
INTERNET_FLAG_EXISTING_CONNECT 0x20000000 Будут выполнены попытки использовать объект InternetConnect, если он существует с теми же самыми аттрибутами, необходимыми для выполнения запроса. Это пригодно только с FTP-операциями, так как FTP является единственным протоколом, который обычно производит множество операций во время одной и той же сессии.WinINet API кэширует дескриптор одиночного соединения для каждого HINTERNET дескриптора, генерируемого InternetOpen. InternetOpenUrl исспользует этот флаг для соединений с HTTP и FTP серверами.
INTERNET_FLAG_HYPERLINK 0x00000400 Вызывает презагрузку, если в возврате с сервера не имеется срока истечения действительности документа (Expires) и нет LastModified, когда производится определение - необходима-ли загрузка элемента с сети.
INTERNET_FLAG_IGNORE_CERT_CN_INVALID 0x00001000 Запрещает проверку сертификатов, основанных на SSL/PCT, которые возвращаются с сервераt относительно имени хоста, приведенного в запросе. Функции WinINet используют простую проверку относительно сертификатов путем сравнения для соответствия имен хостов и правил простых модификаторов.
INTERNET_FLAG_IGNORE_CERT_DATE_INVALID 0x00002000 Запрещает проверку сертификатов, основанных на SSL/PCT относительно соответствия действительности дат.
INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP 0x00008000 Запрещает определение этого специального вида перенаправления. При использовании этого флага, WinINet позволяет прозрачное перенаправление с HTTPS на HTTP URL'ы.
INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS 0x00004000 Запрещает определение этого специального вида перенаправления. При использовании этого флага, WinINet позволяет прозрачное перенаправление с HTTP на HTTPS URL'ы.
INTERNET_FLAG_KEEP_CONNECTION 0x00400000 Использует поддерживающую семантику, если это возможно, для соединения. Этот флаг требуется для Microsoft Network (MSN), NTLM и прочих типов авторизации.
INTERNET_FLAG_NEED_FILE 0x00000010 Служит основанием для создания временного файла, если файл не может быть кэширован.
INTERNET_FLAG_NO_AUTH 0x00040000 Не производит попытки автоматической авторизации.
INTERNET_FLAG_NO_AUTO_REDIRECT 0x00200000 Не производит автоматического перенаправления дескриптора в HttpSendRequest.
INTERNET_FLAG_NO_CACHE_WRITE 0x04000000 Не производит ввода возвращаемой сущности в кэш.
INTERNET_FLAG_NO_COOKIES 0x00080000 Не производит автоматического добавления заголовков cookie в запросы и не заносит автоматически возвращаемые cookies в их базу данных.
INTERNET_FLAG_NO_UI 0x00000200 Запрещает диалоговое окно, связанное с cookie.
INTERNET_FLAG_PASSIVE 0x08000000 Использует семантику пассивного FTP. InternetOpenUrl использует этот флаг для FTP операций с файлами и каталогами.
INTERNET_FLAG_PRAGMA_NOCACHE 0x00000100 Принуждает к тому, чтобы запрос бы разрешен сервером оригинатора, даже если кэшированная копия имеется на прокси-сервере.
INTERNET_FLAG_RAW_DATA 0x40000000 Возвращает данные в виде структуры GOPHER_FIND_DATA при возврате информации о каталоге Gopher или в виде структуры WIN32_FIND_DATA при возврате информации о каталоге FTP. Если этот флаг не определен или если вызов был сделан через CERN proxy, InternetOpenUrl возвращает HTML версию каталога.
INTERNET_FLAG_RELOAD 0x80000000 Принуждает загрузку запрашиваемого файла, объекта или листинга каталога с сервера, а не из кэша.
INTERNET_FLAG_RESYNCHRONIZE 0x00000800 Перезагружает HTTP ресурсы , если ресурс был изменен с момента времени последней загрузки. Все ресурсы FTP и Gopher перезагружаются.
INTERNET_FLAG_SECURE 0x00800000 ИСпользует семантику безопасной транзакции. Это преобразование использует технологию Secure Sockets Layer/Private Communications Technology (SSL/PCT) и значимо только в HTTP запросах.

dwContext
Указатель на переменную, которая определяет посланное значение, установленное приложением, вместо с возвращаемым дескриптором, для любой callback функции.

Возвращаемое значение
Возвращает действительный дескриптор для FTP, Gopher или HTTP URL, в случае если соединение было успешно установлено или NULL, если не удалось установить соединения. Для получения соответствующего сообщения об ошибке вызове фукнцию WinAPI GetLastError. Для определения причины - почему доступ к ресурсу был отклонен вызовите функцию WinAPI InternetGetLastResponseInfo.

Примечания
Вызовите функцию WinAPI InternetCanonicalizeUrl перед вызовом этой функции, если используемый URL содержит относительный URL и базовый URL, разделенные пробелом.
 
Эта функция представляет собой общую функцию, которая может быть использована приложением для получения данных через любой из протоколов, которые поддерживает WinINet. Эта функци особенно полезна в случае, когда у приложения нет необходимости получить доступ к деталям протокола, а требуются только данные, соответствующие используемому URL. Функция InternetOpenUrl разбирает строку URL, устанавливает соединение с сервером и подготавливает загрузку данных, определяемых URL. После чего приложение может использовать функцию InternetReadFile (для файлов) или InternetFindNextFile (для коталогов) для получения данных, расположенных по используемому адресу (URL). При этом нет необходимости вызывать InternetConnect перед вызовом InternetOpenUrl.
 
InternetOpenUrl запрещает Gopher на портах, с номерами меньшими чем 1024, за исключением стандартного порта для Gopher 70 и порта 105 — обычно используемого для поиска имен Central Services Organization (CSO).
 
После того, как приложение завершит использование дескриптора HINTERNET, возвращенного вызовом этой функции (InternetOpenUrl), он должен быть закрыт, с помощью рассмотренной в предыдущей статье функции InternetCloseHandle.
 
Замечание
 
При работе в асинхронном режиме (определяемом установкой в INTERNET_FLAG_ASYNC значения параметра dwFlags для функции InternetOpen) и в случае, если параметр dwContext равен нулю (INTERNET_NO_CALLBACK), callback-функция, установленная с помощью InternetSetStatusCallback на дескрипторе сессии не будет вызвана, однако, производство вызова будет продолжено в асинхронном режиме.
Требования
Клиент Требует использования Windows "Longhorn", Windows XP, Windows 2000 Professional, Windows NT Workstation 4.0, Windows Me, Windows 98 или Windows 95.
Сервер Требует использования Windows Server "Longhorn", Windows Server 2003, Windows 2000 Server или Windows NT Server 4.0
Версия Требуется наличие установленного Internet Explorer 4.0 или более поздних версий.
Заголовки Объявлены в Wininet.h. Упакованный файл заголовков можно взять здесь
DLL Требуется наличие Wininet.dll
Unicode Встроен как InternetOpenW (Unicode) и InternetOpenA (ANSI). Отметьте, что поддержка Unicode на ОС Windows Me/98/95 требует Microsoft Layer для Unicode.

Пример:
Ниже приведен пример программного кода, использующий рассматриваемую функцию в Visual FoxPro:

Declare Integer InternetOpen In WinInet ;
   String lpcAgent, Integer nAccessType, String lpcProxyName, ;
   String lpcProxyBypass, Integer nFlags
Declare Integer InternetCloseHandle In WinInet ;
   Integer nHandle
Declare Integer InternetOpenUrl In wininet;
   INTEGER hInternet, STRING  lpszUrl,;
   STRING  lpszHeaders, INTEGER dwHeadersLength,;
   INTEGER dwFlags, INTEGER dwContext

DECLARE INTEGER InternetReadFile IN wininet; 
    INTEGER   hFile,; 
    STRING  @ sBuffer,; 
    INTEGER   lNumBytesToRead,; 
    INTEGER @ dwNumberOfBytesRead  
 
LOCAL lcUserAgent, lcURL, lcBuffer, lnRet

lcUserAgent = "VisualFoxPro"
lcURL="http://www.hot.ee/jurisfox/index.htm"
lcBuffer=SPACE(1500)
lnRet=0

LOCAL lnInetSessionHandle, lnInetFileHandle
lnInetSessionHandle = InternetOpen("VisualFoxPro",1,.NULL.,.NULL.,0)
lnInetFileHandle = InternetOpenUrl(lnInetSessionHandle,lcURL,.NULL.,0,8,0)
InternetReadFile(lnInetFileHandle, @lcBuffer, 1500, @lnRet)
InternetCloseHandle(lnInetFileHandle)
InternetCloseHandle(lnInetSessionHandle)
? lcBuffer
? lnRet

На моей системе, при подключенном сетевом кабеле, в результате исполнения приведенного выше примера получен следующий результат:

InternetGetConnectedState when network cable pluged in

а при отключенном - следующий:

InternetGetConnectedState when network unpluged

Как видно из приведенного примера, оценка состояния подключения к Internet производится посредством теста установки соответствующих описаниям битов в переменной, переданной в функцию по ссылке.

Функция InternetGetLastResponseInfo

Функция InternetGetLastResponseInfo

Возвращает описание последней ошибки или ответа сервера на процессе вызвавшем эту функцию.

Declare Integer InternetGetLastResponseInfo In WinInet ;
   Integer @nError, String @lpcBuffer, Integer @nBufferLength

Параметры
Функция принимает три параметра: nError, lpcBuffer и nMax_Path, описанные ниже
 

nError
Указатель на переменную, которая получает сообщение об ошибке имеющей отношение к неудачной операции.

lpcBuffer
Указатель на буффер, который принимает текст ошибки.

nBufferLength
Указатель на переменную, которая содержит размер буффера строки lpcBuffer, измеряемый в TCHARs. При возврате из функции этот параметр содержит размер строки, записанный в буффер, исключая нуль-терминатор.

Возвращаемое значение
 
Возвращает TRUE, если текст ошибки успешно записан в буффер, в противном случае возвращает FALSE. Для получения расширенной информации об ошибке в случае, если не удалось записать текст в буффер, вызовите функцию GetLastError. Если буффер слишком мал, для размещения текста ошибки, GetLastError вернет ERROR_INSUFFICIENT_BUFFER и nBufferLength будет содержать минимальный размер буффера, требуемый для возврата полного текста ошибки.

Примечание

Протоколы FTP и Gopher могут вернуть дополнительную текстовую информацию наряду с большинством ошибок. Эта расширенная информация может быть запрошена путем использования этой функции всякий раз, когда GetLastError возвращает ERROR_INTERNET_EXTENDED_ERROR (происходящей после неудавшегося вызова какой-либо функции).

Буффер, указанный параметром lpcBuffer должен быть достаточно большим, для того, чтобы мог вместить строку и нуль-терминатор в ее конце. Однако, отметьте, что значение, возвращаемое в nBufferLength не учитывает нуль-терминатор.

InternetGetLastResponseInfo может быть вызвана многократно, пока другая функция вызывается в этой нитке. Когда вызывается другая функция, внутренний буффер, хранящий информацию о последнем ответе, очищается.

Требования
Клиент Требует использования Windows XP, Windows 2000 Professional, Windows NT Workstation 4.0, Windows Me, Windows 98 или Windows 95.
Сервер Требует использования Windows Server 2003, Windows 2000 Server или Windows NT Server 4.0
Версия Требуется наличие установленного Internet Explorer 3.0 или более поздних версий.
Заголовки Объявлены в Wininet.h. Упакованный файл заголовков можно взять здесь
DLL Требуется наличие Wininet.dll

Пример:
Ниже приведен пример программного кода, использующий рассматриваемую функцию в Visual FoxPro. Программа попытается установить соединение с FTP-сервером, анонимный доступ к которому запрещен. В этом случае, возврат рассатриваемой функции будет содержать описание ошибки (см. screenshot, помещенный сразу после примера)

CLEAR

Declare Integer InternetOpen In WinInet ;
   String lpcAgent, Integer nAccessType, String lpcProxyName, ;
   String lpcProxyBypass, Integer nFlags
Declare Integer InternetCloseHandle In WinInet ;
   Integer nHandle
Declare Integer InternetConnect In WinInet ;
   Integer nInet_Handle, String @lpcServer, Short nPort, String @lpcUserName, ;
   String @lpcPassword, Integer nService, Integer nFlags, Integer nContext
Declare Integer GetLastError In Kernel32
Declare Integer InternetGetLastResponseInfo In WinInet ;
   Integer @nError, String @lpcBuffer, Integer @nBufferLength


ln_Inet_Handle =;
   InternetOpen(;
   "VisualFoxPro",;
   1, ;
   .Null., ;
   .Null.,;
   0;
   )

ln_Error=GetLastError()
? "Error code is: "
?? ln_Error

? ln_Inet_Handle
? "Handle from InternetOpen is: "
?? ln_Inet_Handle

lnSession = ;
   InternetConnect(;
   ln_Inet_Handle,;
   'ftp.foxclub.ru', ;
   21, ;
   'anonymous', ;
   'guest', ;
   1,  ;
   0, ;
   0)

ln_Error=GetLastError()
   ? "Error code is: "
   ?? ln_Error

If ln_Error =0
   ? ln_Inet_Handle
   ? "Handle for FTP session is: "
   ?? lnSession
Else
   lpcBuffer=Space(255)
   nBufferLength=255
   InternetGetLastResponseInfo(@ln_Error,@lpcBuffer,@nBufferLength)
   ? "Error description: "
   ?? lpcBuffer
   ? "Text legth: "
   ?? nBufferLength
   lnReason=GetLastError()
   ? "Reason: "
   ?? lnReason
Endif

Wait

InternetCloseHandle(lnSession)
InternetCloseHandle(ln_Inet_Handle)

Return from InternetGetLastResponseInfo

Смотрите последующие части, для получения информации о WinAPI фукнциях, связанных с получением информации из сети Internet.

Cелектор для быстрого перехода на сайты, связанные с Visual FoxPro.