gpt4 book ai didi

c++ - WinInet InternetReadFile 返回 0x8007007a(传递给系统调用的数据区域太小)

转载 作者:行者123 更新时间:2023-11-28 00:42:13 30 4
gpt4 key购买 nike

我对 WinInet 的 InternetReadFile (C++) 有疑问。
在极少数情况下,该函数失败并且 GetLastError 返回提到的错误 0x8007007a(根据 ErrorLookup 对应于“传递给系统调用的数据区域太小”)。

我有几个问题:

  1. 为什么这在极少数情况下会发生但在其他情况下有效很好(我说的当然是总是下载相同的 ~15MB压缩文件)?
  2. 这真的与传递给 API 调用的缓冲区大小有关吗?我为此调用使用了大小为 1024 BYTES 的常量缓冲区。我应该使用更大的缓冲区大小吗?如果是这样,我怎么知道什么是“正确的”缓冲区大小?
  3. 如果出现此错误,在运行时如何恢复?

添加代码片段(请注意,这将无法正常工作,因为需要一些初始化代码):

#define HTTP_RESPONSE_BUFFER_SIZE 1024
std::vector<char> responseBuffer;
DWORD dwResponseBytesRead = 0;

do
{
const size_t oldBufferSize = responseBuffer.size();
responseBuffer.resize(oldBufferSize + HTTP_RESPONSE_BUFFER_SIZE);

// Now we read again to the last place we stopped
// writing in the previous iteration.
dwResponseBytesRead = 0;
BOOL bInternetReadFile = ::InternetReadFile(hOpenRequest, // hFile. Retrieved from a previous call to ::HttpOpenRequest
(LPVOID)&responseBuffer[oldBufferSize], // lpBuffer.
HTTP_RESPONSE_BUFFER_SIZE, // dwNumberOfBytesToRead.
&dwResponseBytesRead); // lpdwNumberOfBytesRead.

if(!bInternetReadFile)
{
// Do clean up and exit.
DWORD dwErr = ::GetLastError(); // This, in some cases, will return: 0x7a
HRESULT hr = HRESULT_FROM_WIN32(dwErr); // This, in some cases, will return: 0x8007007a
return;
}

// Adjust the buffer according to the actual number of bytes read.
responseBuffer.resize(oldBufferSize + dwResponseBytesRead);
}
while(dwResponseBytesRead != 0);

最佳答案

这是 InternetReadFile 的记录错误:

WinINet attempts to write the HTML to the lpBuffer buffer a line at a time. If the application's buffer is too small to fit at least one line of generated HTML, the error code ERROR_INSUFFICIENT_BUFFER is returned as an indication to the application that it needs a larger buffer.

所以你应该通过增加缓冲区大小来处理这个错误。只需将尺寸加倍,必要时重复。

有一些问题存在差异。不清楚您是否正在阅读一个 HTML 文件,15MB 似乎过多。另一个是这个错误应该很好地重复。但最麻烦的是错误代码值,它包含在 HRESULT 中,这是 COM 组件会返回的错误代码。您应该从 GetLastError() 返回一个 Windows 错误代码,只是 0x7a 而不是 0x8007007a。

请确保您的错误检查是正确的。只在 InternetReadFile() 返回 FALSE 时调用 GetLastError()。如果检查成功(请始终发布一个片段),那么请考虑这个错误实际上是在上游产生的,可能是防火墙或反恶意软件。

关于c++ - WinInet InternetReadFile 返回 0x8007007a(传递给系统调用的数据区域太小),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18248702/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com