функция обратного вызова WINHTTP_STATUS_CALLBACK (winhttp.h)
Тип WINHTTP_STATUS_CALLBACK представляет функцию обратного вызова состояния, определяемую приложением.
Синтаксис
WINHTTP_STATUS_CALLBACK WinhttpStatusCallback;
void WinhttpStatusCallback(
[in] HINTERNET hInternet,
[in] DWORD_PTR dwContext,
[in] DWORD dwInternetStatus,
[in] LPVOID lpvStatusInformation,
[in] DWORD dwStatusInformationLength
)
{...}
Параметры
[in] hInternet
Дескриптор, для которого вызывается функция обратного вызова.
[in] dwContext
Указатель на DWORD , указывающий определяемое приложением контекстное значение, связанное с дескриптором в параметре hInternet .
Значение контекста можно назначить дескриптору Session, Connect или Request, вызвав WinHttpSetOption с параметром WINHTTP_OPTION_CONTEXT_VALUE . Кроме того, winHttpSendRequest можно использовать для связывания значения контекста с дескриптором запроса.
[in] dwInternetStatus
Указывает на DWORD , указывающий код состояния, указывающий, почему вызывается функция обратного вызова. Может иметь одно из следующих значений:
WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION
Закрытие подключения к серверу. Параметр lpvStatusInformation имеет значение NULL.
WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER
Успешно подключено к серверу. Параметр lpvStatusInformation содержит указатель на LPWSTR , который указывает IP-адрес сервера в пунктирной нотации.
WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER
Подключение к серверу. Параметр lpvStatusInformation содержит указатель на LPWSTR , который указывает IP-адрес сервера в пунктирной нотации.
WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED
Подключение к серверу успешно закрыто. Параметр lpvStatusInformation имеет значение NULL.
WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE
Данные доступны для извлечения с помощью WinHttpReadData. Параметр lpvStatusInformation указывает на DWORD , содержащий количество доступных байтов данных. Сам параметр dwStatusInformationLength равен 4 (размер DWORD).
WINHTTP_CALLBACK_STATUS_HANDLE_CREATED
Создан дескриптор HINTERNET . Параметр lpvStatusInformation содержит указатель на дескриптор HINTERNET .
WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING
Это значение дескриптора завершено. Параметр lpvStatusInformation содержит указатель на дескриптор HINTERNET . Для этого дескриптора больше не будет обратных вызовов.
WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE
Заголовок ответа получен и доступен в WinHttpQueryHeaders. Параметр lpvStatusInformation имеет значение NULL.
WINHTTP_CALLBACK_STATUS_INTERMEDIATE_RESPONSE
Получено промежуточное сообщение с кодом состояния (100 уровня) от сервера. Параметр lpvStatusInformation содержит указатель на DWORD , указывающий код состояния.
WINHTTP_CALLBACK_STATUS_NAME_RESOLVED
IP-адрес сервера успешно найден. Параметр lpvStatusInformation содержит указатель на LPWSTR , указывающий имя, которое было разрешено.
WINHTTP_CALLBACK_STATUS_READ_COMPLETE
Данные были успешно считаны с сервера. Параметр lpvStatusInformation содержит указатель на буфер, указанный в вызове WinHttpReadData. Параметр dwStatusInformationLength содержит число прочитанных байтов.
При использовании WinHttpWebSocketReceive параметр lpvStatusInformation содержит указатель на структуру WINHTTP_WEB_SOCKET_STATUS , а параметр dwStatusInformationLength указывает размер lpvStatusInformationInformation.
WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE
Ожидание ответа сервера на запрос. Параметр lpvStatusInformation имеет значение NULL.
WINHTTP_CALLBACK_STATUS_REDIRECT
HTTP-запрос будет автоматически перенаправлять запрос. Параметр lpvStatusInformation содержит указатель на LPWSTR , указывающий на новый URL-адрес. На этом этапе приложение может считывать любые данные, возвращенные сервером с ответом перенаправления, и может запрашивать заголовки ответа. Он также может отменить операцию, закрыв дескриптор.
WINHTTP_CALLBACK_STATUS_REQUEST_ERROR
Ошибка при отправке HTTP-запроса. Параметр lpvStatusInformation содержит указатель на структуру WINHTTP_ASYNC_RESULT . Его член dwResult указывает идентификатор вызываемой функции, а dwError — возвращаемое значение.
WINHTTP_CALLBACK_STATUS_REQUEST_SENT
Запрос сведений успешно отправлен на сервер. Параметр lpvStatusInformation содержит указатель на DWORD , указывающий количество отправленных байтов.
WINHTTP_CALLBACK_STATUS_RESOLVING_NAME
Поиск IP-адреса имени сервера. Параметр lpvStatusInformation содержит указатель на разрешаемое имя сервера.
WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED
Успешно получен ответ от сервера. Параметр lpvStatusInformation содержит указатель на DWORD , указывающий количество полученных байтов.
WINHTTP_CALLBACK_STATUS_SECURE_FAILURE
При установке безопасного (HTTPS) подключения к серверу произошла одна или несколько ошибок. Параметр lpvStatusInformation содержит указатель на DWORD , представляющий собой побитовое или сочетание значений ошибок. Дополнительные сведения см. в описании lpvStatusInformation.
WINHTTP_CALLBACK_STATUS_SENDING_REQUEST
Отправка запроса информации на сервер. Параметр lpvStatusInformation имеет значение NULL.
WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE
Запрос успешно выполнен. Параметр lpvStatusInformation — это значение lpOptional, передаваемое в WinHttpSendRequest (начальный текст запроса), а параметр dwStatusInformationLength указывает количество успешно записанных начальных байтов тела (значение dwOptionalLength, переданное в WinHttpSendRequest).
WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE
Данные успешно записаны на сервер. Параметр lpvStatusInformation содержит указатель на DWORD , указывающий количество записанных байтов.
При использовании WinHttpWebSocketSend параметр lpvStatusInformation содержит указатель на структуру WINHTTP_WEB_SOCKET_STATUS , а параметр dwStatusInformationLength указывает размер lpvStatusInformationInformation.
WINHTTP_CALLBACK_STATUS_GETPROXYFORURL_COMPLETE
Операция, инициированная вызовом WinHttpGetProxyForUrlEx , завершена. Данные доступны для извлечения с помощью WinHttpReadData.
WINHTTP_CALLBACK_STATUS_CLOSE_COMPLETE
Подключение было успешно закрыто с помощью вызова WinHttpWebSocketClose. Параметр lpvStatusInformation имеет значение NULL.
WINHTTP_CALLBACK_STATUS_SHUTDOWN_COMPLETE
Подключение было успешно завершено с помощью вызова WinHttpWebSocketShutdown. Параметр lpvStatusInformation имеет значение NULL.
[in] lpvStatusInformation
Указатель на буфер, указывающий сведения, относящиеся к этому вызову функции обратного вызова. Формат этих данных зависит от значения аргумента dwInternetStatus . Дополнительные сведения см. в разделе dwInternetStatus.
Если аргумент dwInternetStatus имеет WINHTTP_CALLBACK_STATUS_SECURE_FAILURE, то lpvStatusInformation указывает на DWORD, который представляет собой побитовую или комбинацию одного или нескольких из следующих значений.
[in] dwStatusInformationLength
WINHTTP_CALLBACK_STATUS_REDIRECT обратные вызовы состояния предоставляют значение dwStatusInformationLength , соответствующее количеству символов LPWSTR , на который указывает lpvStatusInformation.
Возвращаемое значение
None
Remarks
Функция обратного вызова должна быть threadsafe и reentrant, так как ее можно вызвать в другом потоке для отдельного запроса и повторно ввести в том же потоке для текущего запроса. Поэтому он должен быть закодирован для безопасной обработки повторного входенения. Если параметр dwInternetStatus равен WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, обратный вызов не должен обрабатывать повторный ввод для того же запроса, так как этот обратный вызов гарантированно является последним и не выполняется при обработке других сообщений для этого запроса.
Функция обратного вызова состояния получает обновления о состоянии асинхронных операций с помощью флагов уведомлений. Уведомления, указывающие, что определенная операция завершена, называются уведомлениями о завершении или просто завершениями. В следующей таблице перечислены шесть флагов завершения и соответствующая функция, которая завершается при получении этого флага.
Флаг завершения | Функция |
---|---|
WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE | WinHttpQueryDataAvailable |
WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE | WinHttpReceiveResponse |
WINHTTP_CALLBACK_STATUS_READ_COMPLETE | WinHttpReadData |
WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE | WinHttpSendRequest |
WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE | WinHttpWriteData |
WINHTTP_CALLBACK_STATUS_REQUEST_ERROR | Любой из перечисленных выше функций при возникновении ошибки. |
Так как обратные вызовы выполняются во время обработки запроса, приложение должно тратить как можно меньше времени на функцию обратного вызова, чтобы избежать снижения пропускной способности данных в сети. Например, отображение диалогового окна в функции обратного вызова может быть такой длительной операцией, что сервер завершает запрос.
Функция обратного вызова может вызываться в контексте потока, отличном от потока, который инициировал запрос.
Аналогичным образом, при асинхронном вызове WinHttp отсутствует сходство потоков обратного вызова: вызов может начинаться из одного потока, но любой другой поток может принимать обратный вызов.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows XP, Windows 2000 Профессиональная с пакетом обновления 3 (SP3) [только классические приложения] |
Минимальная версия сервера | Windows Server 2003, Windows 2000 Server с пакетом обновления 3 (SP3) [только классические приложения] |
Целевая платформа | Windows |
Header | winhttp.h |
Распространяемые компоненты | WinHTTP 5.0 и Internet Explorer 5.01 или более поздней версии в Windows XP и Windows 2000. |