Функция WinHttpSetStatusCallback (winhttp.h)
Функция WinHttpSetStatusCallback настраивает функцию обратного вызова, которую WinHTTP может вызывать по мере выполнения операции.
Синтаксис
WINHTTPAPI WINHTTP_STATUS_CALLBACK WinHttpSetStatusCallback(
[in] HINTERNET hInternet,
[in] WINHTTP_STATUS_CALLBACK lpfnInternetCallback,
[in] DWORD dwNotificationFlags,
[in] DWORD_PTR dwReserved
);
Параметры
[in] hInternet
Дескриптор HINTERNET , для которого должен быть задан обратный вызов.
[in] lpfnInternetCallback
Указатель на функцию обратного вызова, вызываемую при выполнении. Присвойте этому параметру значение NULL , чтобы удалить существующую функцию обратного вызова. Дополнительные сведения о функции обратного вызова см. в разделе WINHTTP_STATUS_CALLBACK.
[in] dwNotificationFlags
Длинное целое число без знака, указывающее флаги, указывающие, какие события активируют функцию обратного вызова.
Ниже приведены возможные значения.
Значение | Значение |
---|---|
|
Активируется при любом уведомлении о завершении. Этот флаг указывает, что используются все уведомления, необходимые для операций чтения или записи. Список завершений см. в WINHTTP_STATUS_CALLBACK . |
|
Активируется при любом уведомлении об изменении состояния, включая завершения. Список уведомлений см. в WINHTTP_STATUS_CALLBACK . |
|
Активируется после начала и завершения разрешения имен. |
|
Активируется после начала и завершения подключения к серверу. |
|
Активируется при обнаружении прокси-сервера. |
|
Активируется при выполнении запроса данных. |
|
Активируется, когда заголовки ответа доступны для получения. |
|
Активируется после завершения операции чтения данных. |
|
Активируется при возникновении асинхронной ошибки. |
|
Активируется после начала и завершения отправки заголовка запроса с помощью WinHttpSendRequest. |
|
Активируется при отправке заголовка запроса с помощью WinHttpSendRequest. |
|
Активируется после завершения операции после передачи данных. |
|
Активируется после начала и завершения получения ресурса с HTTP-сервера. |
|
Активируется при начале и завершении закрытия HTTP-подключения. |
|
Активируется при создании или закрытии дескриптора HINTERNET . |
|
Активируется при перенаправлении запроса. |
|
Активируется при получении промежуточного (уровня 100) сообщения кода состояния от сервера. |
|
Активируется при сбое безопасного подключения. |
[in] dwReserved
Этот параметр зарезервирован и должен иметь значение NULL.
Возвращаемое значение
В случае успешного выполнения возвращает указатель на ранее определенную функцию обратного вызова состояния или значение NULL , если ранее не была определена функция обратного вызова состояния. Возвращает WINHTTP_INVALID_STATUS_CALLBACK , если не удалось установить функцию обратного вызова. Чтобы получить дополнительные сведения об ошибке, вызовите Метод GetLastError. Среди возвращаемых кодов ошибок приведены следующие.
Код ошибки | Описание |
---|---|
|
Для этой операции указан неправильный тип дескриптора. |
|
Произошла внутренняя ошибка. |
|
Недостаточно памяти для выполнения запрошенной операции. (Код ошибки Windows) |
Комментарии
Если задать обратный вызов для дескриптора сеанса перед созданием дескриптора запроса, дескриптор запроса наследует указатель функции обратного вызова от родительского сеанса.
Даже если WinHTTP используется в асинхронном режиме (то есть при установке WINHTTP_FLAG_ASYNC в WinHttpOpen), эта функция работает синхронно. Возвращаемое значение указывает на успех или сбой. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.
Синхронные и асинхронные функции используют функцию обратного вызова для указания хода выполнения запроса, например разрешения имени, подключения к серверу и т. д. Функция обратного вызова требуется для асинхронной операции.
Функция обратного вызова может быть задана для любого дескриптора и наследуется производными дескрипторами. Функцию обратного вызова можно изменить с помощью WinHttpSetStatusCallback при условии, что нет ожидающих запросов, которые должны использовать предыдущее значение обратного вызова. Однако изменение функции обратного вызова для дескриптора не приводит к изменению обратных вызовов на производных дескрипторах, таких как возвращенные WinHttpConnect. Необходимо изменить функцию обратного вызова на каждом уровне.
Многие функции WinHTTP выполняют несколько операций в сети. Выполнение каждой операции может занять время, а каждая из них может завершиться ошибкой.
После инициации функции WinHttpSetStatusCallback к функции обратного вызова можно получить доступ из WinHTTP для мониторинга ресурсоемких сетевых операций.
В конце асинхронной обработки приложение может задать для функции обратного вызова значение NULL. Это не позволяет клиентскому приложению получать дополнительные уведомления.
В следующем фрагменте кода показан рекомендуемый метод для задания функции обратного вызова значения NULL.
WinHttpSetStatusCallback( hOpen,
NULL,
WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS,
NULL );
Однако обратите внимание, что WinHTTP не синхронизирует WinHttpSetStatusCallback с рабочими потоками. Если обратный вызов, исходящий из другого потока, выполняется, когда приложение вызывает WinHttpSetStatusCallback, приложение по-прежнему получает уведомление о обратном вызове даже после того, как WinHttpSetStatusCallback успешно задает функцию обратного вызова значение NULL и возвращает.
Примеры
В следующем примере показано, как установить функцию обратного вызова для асинхронных функций WinHTTP. В примере предполагается, что функция WINHTTP_STATUS_CALLBACK с именем "AsyncCallback( )" была ранее реализована:
// Use WinHttpOpen to obtain an HINTERNET handle.
HINTERNET hSession = WinHttpOpen(L"A WinHTTP Example Program/1.0",
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS, 0);
if (hSession)
{
// Install the status callback function.
WINHTTP_STATUS_CALLBACK isCallback = WinHttpSetStatusCallback( hSession,
(WINHTTP_STATUS_CALLBACK)AsyncCallback,
WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS,
NULL);
// Place additional code here.
// When finished, release the HINTERNET handle.
WinHttpCloseHandle(hSession);
}
else
{
printf("Error %u in WinHttpOpen.\n", GetLastError());
}
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows XP, Windows 2000 Профессиональная с пакетом обновления 3 (SP3) [только классические приложения] |
Минимальная версия сервера | Windows Server 2003, Windows 2000 Server с пакетом обновления 3 (SP3) [только классические приложения] |
Целевая платформа | Windows |
Header | winhttp.h |
Библиотека | Winhttp.lib |
DLL | Winhttp.dll |
Распространяемые компоненты | WinHTTP 5.0 и Internet Обозреватель 5.01 или более поздней версии в Windows XP и Windows 2000. |