C ++ WinHTTP API чтения данных - PullRequest
0 голосов
/ 09 ноября 2011

Я пытаюсь загрузить данные с веб-страницы, затем проанализировать их, проблема в том, что я не могу получить значение 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 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());
            }


         }

      } while( dwSize > 0 );
   }
}

Ответы [ 2 ]

2 голосов
/ 09 ноября 2011

Я думаю, что сразу после WinHttpReadData вы должны добавить содержимое pszOutBuffer в строку, чтобы вы могли использовать его позже.
Как вы сказали, pszOutBuffer продолжает перезаписываться на каждой итерации цикла. Похоже, это просто временное хранилище для копирования в нечто постоянное.

0 голосов
/ 09 ноября 2011

Этот пример кода просто ничего не делает с данными. Вы должны добавить код, чтобы сделать что-то с данными, например:

     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
        {
               // add code here to do something with the data
               // data is in pszOutBuffer and byte count is dwSize
        }
     }

  } while( dwSize > 0 );

Звонок на ZeroMemory не нужен. Вероятно, это поможет вам не запутаться, если ваша программа ошибочно попытается получить доступ к данным после точки, которая была прочитана. В этом нет необходимости, если ваш код следует основным правилам здравого смысла при работе с данными, полученными по сети - не читайте за dwSize и не предполагайте, что у данных есть завершающий нулевой байт.

...