WinHttpReadData в приложении Win32 не работает должным образом

Я использую WinHTTP, чтобы получить текст с URL http://www.google.com/complete/search?output=toolbar&гл = VI&д = hoazzztf. Текст ответа должен быть: <toplevel/> но я получаю ответ как это:

                          введите описание изображения здесь

Любая идея? Поблагодарить!
(Текст ответа может содержать символ UTF-8)

DWORD dwSize = 0;
DWORD dwDownloaded = 0;
LPSTR pszOutBuffer;
HINTERNET hSession = NULL;
HINTERNET hConnect = NULL;
HINTERNET hRequest = NULL;
BOOL bResults = FALSE;

hSession = WinHttpOpen(L"WinHTTP Example/1.0",
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS, 0);

WinHttpSetTimeouts(hSession, 1000, 2000, 1000, 1000);

// Specify an HTTP server.
if (hSession)
hConnect = WinHttpConnect(hSession, L"www.google.com",
INTERNET_DEFAULT_HTTPS_PORT, 0);

// Create an HTTP request handle.
if (hConnect)
hRequest = WinHttpOpenRequest(hConnect, L"GET", L"/complete/search?output=toolbar&hl=vi&q=hoazzztf",
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);

if (bResults)
bResults = WinHttpReceiveResponse(hRequest, NULL);

if (!bResults)
{
SetWindowText(hWnd, L"ERR-4");
break;
}

if (bResults)
{
do
{
// Check for available data.
dwSize = 0;
if (!WinHttpQueryDataAvailable(hRequest, &dwSize))
{
break;
}

// No more available data.
if (!dwSize)
break;

// Allocate space for the buffer.
pszOutBuffer = new char[dwSize + 1];
if (!pszOutBuffer)
{
break;
}

// Read the Data.
ZeroMemory((LPVOID)pszOutBuffer, dwSize + 1);

if (!WinHttpReadData(hRequest, (LPVOID)pszOutBuffer,
dwSize, &dwDownloaded))
{
}
else
{
MessageBox(hWnd, (LPCWSTR)pszOutBuffer, L"", NULL);
}

// Free the memory allocated to the buffer.
delete[] pszOutBuffer;

// This condition should never be reached since WinHttpQueryDataAvailable
// reported that there are bits to read.
if (!dwDownloaded)
break;

} while (dwSize > 0);
}// Report any errors.

// Close any open handles.
if (hRequest) WinHttpCloseHandle(hRequest);
if (hConnect) WinHttpCloseHandle(hConnect);
if (hSession) WinHttpCloseHandle(hSession);

0

Решение

WinHttpReadData читает необработанные данные, но вы вынудили это быть массивом из 2 байтов WCHAR«S. Я думаю, что Google использует кодировку utf-8 на своих страницах, поэтому вам нужно сначала конвертировать ее.

Другая проблема в вашем коде состоит в том, что вы не устанавливаете завершающий 0:

...
else
{
pszOutBuffer[ dwDownloaded ] = 0;
MessageBox(hWnd, pszOutBuffer, "", NULL);
}

Затем, проверяя значение, возвращаемое new бессмысленно, потому что new выдает исключение в случае сбоя.

2

Другие решения

Я исправил:

MessageBox(hWnd, (LPCWSTR)pszOutBuffer, L"", NULL);

чтобы:

int wchars_num = MultiByteToWideChar(CP_UTF8, 0, pszOutBuffer, -1, NULL, 0);
wchar_t* wstr = new wchar_t[wchars_num];
MultiByteToWideChar(CP_UTF8, 0, pszOutBuffer, -1, wstr, wchars_num);
0

По вопросам рекламы [email protected]