c++ WinHTTP API读取数据

C++ WinHTTP API reading data

本文关键字:数据 读取 API WinHTTP c++      更新时间:2023-10-16

我试图从网页下载数据然后解析它,问题是我无法获得pszoutbuffer (ZeroMemory函数删除它)的值,我从MSDN示例中获取了代码

void  http_connect::read_data(void)
{
   // Keep checking for data until there is nothing left.
   if( bResults )
   {
      do
      {
          // Check for 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 memoryn");
             dwSize=0;
         }
         else
         {
             // Read the Data.
             ZeroMemory(pszOutBuffer, dwSize+1);
             if (!WinHttpReadData( hRequest, (LPVOID)pszOutBuffer, 
                              dwSize, &dwDownloaded))
            {
                  printf( "Error %u in WinHttpReadData.n", 
                    GetLastError());
            }

         }
      } while( dwSize > 0 );
   }
}

我认为在WinHttpReadData之后,您应该立即将pszOutBuffer的内容附加到字符串中,以便您以后可以使用它。
正如您所说,每次循环迭代都会覆盖pszOutBuffer。它看起来只是一个临时存储空间,供您复制到永久存储空间

这个示例代码没有对数据做任何操作。您应该添加代码来处理数据,如下所示:

     if (!pszOutBuffer)
     {
         printf("Out of memoryn");
         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
        {
               // add code here to do something with the data
               // data is in pszOutBuffer and byte count is dwSize
        }
     }
  } while( dwSize > 0 );

不需要呼叫ZeroMemory。这可能是为了防止您在程序错误地试图访问超出读取点的数据时感到困惑。如果您的代码遵循处理通过网络接收的数据的基本完整性规则,则不需要这样做——不要读取超过dwSize的数据,也不要假设数据具有终止零字节。