WinHttpQueryDataAvailable的使用
来源:互联网 发布:tomcat java options 编辑:程序博客网 时间:2024/05/19 16:06
WinHttpQueryDataAvailableWinHttpQueryDataAvailable函数返回可用WinHttpReadData读取的数据量(以字节为单位)。BOOL WinHttpQueryDataAvailable HINTERNET hRequest, LPDWORD lpdwNumberOfBytesAvailable);参数h请求 [in] WinHttpOpenRequest返回的有效的HINTERNET句柄。已调用WinHttpReceiveResponse此句柄并在WinHttpQueryDataAvailable被调用之前完成。lpdwNumberOfBytesAvailable [out,optional]指向无符号长整型变量的指针,该变量接收可用字节数。当在异步模式下使用WinHTTP时,始终将此参数设置为NULL并在回调函数中检索数据; 不这样做可能会导致内存故障。返回值如果函数成功,则返回TRUE,否则返回FALSE。要获取扩展错误数据,请调用GetLastError。返回的错误代码有:错误代码说明ERROR_WINHTTP_CONNECTION_ERROR与服务器的连接已重置或终止,或遇到不兼容的SSL协议。例如,WinHTTP版本5.1不支持SSL2,除非客户端专门启用它。ERROR_WINHTTP_INCORRECT_HANDLE_STATE请求的操作无法完成,因为提供的句柄不在正确的状态。 ERROR_WINHTTP_INCORRECT_HANDLE_TYPE此操作提供的句柄类型不正确。 ERROR_WINHTTP_INTERNAL_ERROR发生内部错误。 ERROR_WINHTTP_OPERATION_CANCELLED操作已取消,通常是因为在操作完成之前关闭请求的句柄已关闭。 ERROR_WINHTTP_TIMEOUT请求已超时。 ERROR_NOT_ENOUGH_MEMORY没有足够的内存来完成请求的操作。(Windows错误代码)备注当在异步模式下使用WinHTTP(即WinHTPPOpen中设置了WINHTTP_FLAG_ASYNC)时,该功能可以同步或异步操作。如果它返回FALSE,它失败,您可以调用GetLastError获取扩展错误信息。如果返回TRUE,请使用WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE完成来确定此函数是否成功和参数的值。WINHTTP_CALLBACK_STATUS_REQUEST_ERROR完成表示操作异步完成但失败。警告当在异步模式下使用WinHTTP时,始终将lpdwNumberOfBytesAvailable参数设置为NULL并检索回调函数中可用的字节; 否则可能会发生内存故障。此函数返回随后调用WinHttpReadData可立即读取的数据字节数。如果没有数据可用,并且文件的结尾尚未到达,则会发生两件事之一。如果会话是同步的,请求等待,直到数据可用。如果会话是异步的,则该函数返回TRUE,当数据变为可用时,使用WINHTTP_STATUS_CALLBACK_DATA_AVAILABLE调用回调函数,并通过调用WinHttpReadData指示可立即读取的字节数。在通过调用WinHttpQueryDataAvailable指示的所有可用数据都被读取之前,不会重新计算剩余的数据量。使用WinHttpReadData的返回值来确定响应何时被完全读取。 重要不要使用WinHttpQueryDataAvailable的返回值来确定是否已经达到响应的结束,因为并非所有服务器都正确终止响应,并且不正确终止的响应导致WinHttpQueryDataAvailable可以预测更多的数据。对于由WinHttpOpenRequest函数创建并由WinHttpSendRequest发送的HINTERNET句柄,必须在使用WinHttpQueryDataAvailable之前在句柄上调用WinHttpReceiveResponse。如果WinHttpSetStatusCallback已经安装了一个状态回调函数,那么在WinHttpSetStatusCallback的dwNotificationFlags参数中设置的以下通知的那些指示了检查可用数据的进度: WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE注意有关Windows XP,Windows 2000和Windows NT 4.0的详细信息,请参阅运行时要求。示例代码 以下示例显示如何使用安全事务语义从HTTPS服务器下载资源。示例代码初始化WinHTTP API,选择目标HTTPS服务器,然后打开并发送此安全资源的请求。WinHttpQueryDataAvailable与请求句柄一起使用,以确定有多少数据可供下载,然后WinHttpReadData用于读取该数据。该过程重复,直到整个文档被检索和显示。
DWORD dwSize = 0; DWORD dwDownloaded = 0; LPSTR pszOutBuffer; BOOL bResults = FALSE; HINTERNET hSession = NULL, hConnect = NULL, hRequest = NULL; // Use WinHttpOpen to obtain a session handle. hSession = WinHttpOpen( L"WinHTTP Example/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); // Specify an HTTP server. if (hSession) hConnect = WinHttpConnect( hSession, L"www.microsoft.com", INTERNET_DEFAULT_HTTPS_PORT, 0); // Create an HTTP request handle. if (hConnect) hRequest = WinHttpOpenRequest( hConnect, L"GET", NULL, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE); // Send a request. if (hRequest) bResults = WinHttpSendRequest( hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0); // End the request. if (bResults) bResults = WinHttpReceiveResponse( hRequest, NULL); // Continue to verify data until there is nothing left. if (bResults) do { // Verify available data. dwSize = 0; if (!WinHttpQueryDataAvailable( hRequest, &dwSize)) printf("Error %u in WinHttpQueryDataAvailable.\n",GetLastError()); // Allocate space for the buffer. pszOutBuffer = new char[dwSize+1]; if (!pszOutBuffer) { printf("Out of memory\n"); dwSize=0; } else { // Read the Data. ZeroMemory(pszOutBuffer, dwSize+1); if (!WinHttpReadData( hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded)) printf("Error %u in WinHttpReadData.\n", GetLastError()); else cout << pszOutBuffer; // Free the memory allocated to the buffer. delete [] pszOutBuffer; } } while (dwSize>0); // Report any errors. if (!bResults) printf("Error %d has occurred.\n",GetLastError()); // Close open handles. if (hRequest) WinHttpCloseHandle(hRequest); if (hConnect) WinHttpCloseHandle(hConnect); if (hSession) WinHttpCloseHandle(hSession);
0 0
- WinHttpQueryDataAvailable的使用
- GUID使用的使用
- ${}的使用
- 的使用
- @[],@()的使用
- ->的使用
- +、-、*、/、%的使用
- &&的使用
- %:的使用
- Makefile中使用$$的使用
- Makefile中使用$$的使用
- Red5的使用--使用日志
- prefernce的使用具体使用
- 【工具使用】git 的使用
- 关于使用AsyncTaskLoader的使用
- 使用CABasicAnimation的基本使用
- 使用RocketMQ的客户端使用
- gulp的使用基本使用
- 关于mysql中的count()函数
- Spring整合Ehcache管理缓存
- Android 6.0 以上实现状态栏白底黑字 「白色标题栏 App 享受 iOS 般的沉浸体验」
- PHP文件上传
- #706 – 在应用程序间拖拽进行控件复制(Dragging User Interface Elements Between Applications)
- WinHttpQueryDataAvailable的使用
- RSA加密算法原理及RES签名算法简介
- SHELL文件夹及其子文件夹的遍历
- 播放网络视频(可用)
- mysql几种性能测试的工具使用
- 设计模式
- shiro登录验证
- 简单的,到处是bug的,菜鸟自学初学写的,Java的银行存取款代码
- MySQL必知必会之2