Я использую 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:
- [Скриншот стека вызовов] https://imgur.com/a/vRMYAbN
- [ Выброшено исключение] https://imgur.com/a/4AWhf9u
РЕДАКТИРОВАТЬ :
Полный код функции:
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
Мобильная версия