描述
WINHTTP_STATUS_CALLBACK回调过程是应用程序定义状态回调过程的原型。
C / C ++语法
typedef void ( CALLBACK *WINHTTP_STATUS_CALLBACK )( __in HINTERNET hInternet, __in DWORD_PTR dwContext, __in DWORD dwInternetStatus, __in LPVOID lpvStatusInformation, __in DWORD dwStatusInformationLength ); |
PowerBASIC 语法
SUB CALLBACK WINHTTP_STATUS_CALLBACK ( _ BYVAL hInternet AS DWORD _ BYVAL dwContext AS DWORD _ BYVAL dwInternetStatus AS DWORD _ BYVAL lpvStatusInformation AS DWORD _ BYVAL dwStatusInformationLength AS DWORD _ ) |
参数
hInternet
[in]调用回调函数的句柄。
dwContext
[in]指向类型为unsigned long integer的值的指针,用于指定与HINTERNET参数中的句柄相关联的应用程序定义的上下文值。
可以通过使用WINHTTP_OPTION_CONTEXT_VALUE选项调用WinHttpSetOption将上下文值分配给会话,连接或请求句柄。或者,可以使用WinHttpSendRequest将上下文值与请求句柄相关联。
dwInternetStatus
[in]类型unsigned long integer的值,用于指定调用回调函数的原因的状态代码。这可以是以下值之一:
WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION
关闭与服务器的连接。lpvStatusInformation参数为NULL。此标志已被弃用。
WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER
已成功连接到服务器。lpvStatusInformation参数包含一个指向以null结尾的Unicode字符串的指针,该字符串以点划线表示服务器的IP地址。此标志已被弃用。
WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER
连接到服务器。lpvStatusInformation参数包含指向以空值终止的Unicode字符串的指针,该字符串以虚线表示法表示服务器的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参数为空。
WINHTTP_CALLBACK_STATUS_INTERMEDIATE_RESPONSE
从服务器接收到中间(100级)状态码消息。lpvStatusInformation参数包含指向状态代码的DWORD的指针。
WINHTTP_CALLBACK_STATUS_NAME_RESOLVED
成功找到服务器的IP地址。lpvStatusInformation参数包含一个指向已终止的Unicode字符串的指针,该字符串表示已解析的名称。此标志已被弃用。
WINHTTP_CALLBACK_STATUS_READ_COMPLETE
从服务器成功读取数据。lpvStatusInformation参数包含指向调用WinHttpReadData中指定的缓冲区的指针。dwStatusInformationLength参数包含读取的字节数。
WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE
等待服务器响应请求。lpvStatusInformation参数为NULL。此标志已被弃用。
WINHTTP_CALLBACK_STATUS_REDIRECT
HTTP请求即将自动重定向请求。lpvStatusInformation参数包含一个指向空值终止的Unicode字符串的指针,指示新的URL。此时,应用程序可以使用重定向响应读取服务器返回的任何数据,并可以查询响应头。也可以通过关闭手柄取消操作。
WINHTTP_CALLBACK_STATUS_REQUEST_ERROR
在发送HTTP请求时发生错误。lpvStatusInformation参数包含指向WINHTTP_ASYNC_RESULT结构的指针,其中dwResult成员表示函数的返回值以及适用的任何错误代码。
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
从服务器检索安全套接字层(SSL)证书时遇到一个或多个错误。lpvStatusInformation参数包含一个标志。有关详细信息,请参阅lpvStatusInformation的说明。
WINHTTP_CALLBACK_STATUS_SENDING_REQUEST
向服务器发送信息请求。lpvStatusInformation参数为NULL。此标志已被弃用。
WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE
请求成功完成。lpvStatusInformation参数为NULL。
WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE
数据已成功写入服务器。lpvStatusInformation参数包含指向写入字节数的DWORD的指针。
lpvStatusInformation
[in]指向缓冲区的指针,指定与该回调函数的此调用相关的信息。此数据的格式取决于dwInternetStatus参数的值。有关详细信息,请参阅dwInternetStatus.
如果dwInternetStatus参数为WINHTTP_CALLBACK_STATUS_SECURE_FAILURE,则此参数可以是以下值之一。
WINHTTP_CALLBACK_STATUS_FLAG_CERT_REV_FAILED
认证撤销检查已启用,但撤销检查无法验证证书是否已被撤销。用于检查撤销的服务器可能无法访问。
WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CERT
SSL证书无效。
WINHTTP_CALLBACK_STATUS_FLAG_CERT_REVOKED
SSL证书被撤销。
WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA
该函数不熟悉生成服务器证书的证书颁发机构。
WINHTTP_CALLBACK_STATUS_FLAG_CERT_CN_INVALID
SSL证书通用名(主机名字段)不正确,例如,如果您输入www.microsoft.com,证书上的通用名称表示www.msn.com。
WINHTTP_CALLBACK_STATUS_FLAG_CERT_DATE_INVALID
从服务器接收的SSL证书日期是不好的。证书已过期。
WINHTTP_CALLBACK_STATUS_FLAG_SECURITY_CHANNEL_ERROR
应用程序在加载SSL库时遇到内部错误。
dwStatusInformationLength
[in]类型unsigned long integer的值,指定lpvStatusInformation缓冲区的大小(以字节为单位)。
备注
此回调函数必须是线程安全的,并且在处理时应该能够处理针对相同请求的重入。dwInternetStatus参数中的WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING值表示这是应用程序接收的最后一个回调,并且没有处理此请求的其他消息。
回调函数必须是线程安全和可重入的,因为它可以在另一个线程上调用一个单独的请求,并重新进入当前请求的同一线程。因此,必须对其进行编码,以便在处理时安全地处理折返。当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 |
任何上述功能发生错误时。 |
由于在请求处理期间进行回调,所以应用程序应该在回调函数中花费尽可能少的时间来避免降低网络上的数据吞吐量。例如,在回调函数中显示一个对话框可能是这么长的操作,服务器终止请求。
回调函数可以在与发起请求的线程不同的线程上下文中调用。