Сбой WinHttpOpen с STATUS_HEAP_CORRUPTIONC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Сбой WinHttpOpen с STATUS_HEAP_CORRUPTION

Сообщение Anonymous »

Я создаю библиотеку DLL x64 для Windows на C/C++ для отправки запроса POST на заданный URL-адрес и получения ответа.
Я использую WinHttp для отправки запроса, время от времени (не всегда, примерно в 1 раз из 5) моя DLL выходит из строя из-за STATUS_HEAP_CORRUPTION.
Я пробовал запустить проверку с помощью ApplicationVerifier и запустить свою dll через прокси-сервер rundll32.exe для отладки и без каких-либо объяснений, при запуске этими двумя способами STATUS_HEAP_CORRUPTION никогда не возникает.
Это происходит только в том случае, если я запускаю свою dll из приложения или через rundll32.exe в режиме выпуска.
Отладчик Visual Studio сообщает об исключении в этой строке:
HINTERNET hSession = WinHttpOpen(L"Mozilla/5.0 MyAgentTest", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, NULL);

Я не использую и не выполняю функцию в разных потоках, все выполняется в основном потоке dll.
Также прилагаю два скриншота Отчет отладчика Visual Studio: Может ли кто-нибудь объяснить, почему?
РЕДАКТИРОВАТЬ :
Полный код функции:
LPSTR SendPostRequest(LPCWSTR domain, LPCWSTR url, LPCSTR data, BOOL ssl)
{
HINTERNET hSession = WinHttpOpen(L"Mozilla/5.0 MyAgentTest", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, NULL);

if (hSession == NULL) return NULL;

HINTERNET hConnect = WinHttpConnect(hSession, domain, INTERNET_DEFAULT_PORT, NULL);

if (hConnect == NULL)
{
WinHttpCloseHandle(hSession);
return NULL;
}

HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"POST", url, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, (ssl ? WINHTTP_FLAG_SECURE : 0) | WINHTTP_FLAG_REFRESH);

if (hRequest == NULL)
{
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);

return NULL;
}

if (data == NULL) data = "";

CONST DWORD length = strlen(data);
BOOL requestSuccess = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, -1, (LPVOID)data, length, length, 0);

if (requestSuccess == FALSE)
{
WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);

return NULL;
}

requestSuccess = WinHttpReceiveResponse(hRequest, NULL);

if (requestSuccess == FALSE)
{
WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);

return NULL;
}

DWORD dataSize = 0, dwDownloaded = 0;
CHAR* pszOutBuffer = NULL;

string response;

do
{
dataSize = 0;

if (WinHttpQueryDataAvailable(hRequest, &dataSize) == FALSE)
{
WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);

return NULL;
}

pszOutBuffer = new CHAR[dataSize + 1]{};

if (pszOutBuffer == NULL) continue;

if (WinHttpReadData(hRequest, (LPVOID)pszOutBuffer, dataSize, &dwDownloaded))
{
response = response + string(pszOutBuffer);
}

delete[] pszOutBuffer;

} while (dataSize > 0);

WinHttpCloseHandle(hRequest);
WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession);

if (!response.empty())
{
CONST SIZE_T responseLength = response.length() + 1;

CHAR* result = new CHAR[responseLength]{};
strcpy_s(result, responseLength, response.c_str());

response.clear();

return result;
}

return NULL;
}


Подробнее здесь: https://stackoverflow.com/questions/783 ... corruption
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»