HTTP 请求导致堆损坏

http requests are causing heap corruption?

本文关键字:损坏 请求 HTTP      更新时间:2023-10-16

我正在尝试从我的c ++项目向php脚本发送一些数据,如下所示:

void sendThatBitch()
{
    DWORD dwSize = 0;
    DWORD dwDownloaded = 0;
    LPSTR pszOutBuffer;
    vector <string>  vFileContent;
    BOOL  bResults = FALSE;
    HINTERNET  hSession = NULL,
        hConnect = NULL,
        hRequest = NULL;
    // Use WinHttpOpen to obtain a session handle.
    hSession = WinHttpOpen(L"WinHTTP Example/1.0",
        WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
        WINHTTP_NO_PROXY_NAME,
        WINHTTP_NO_PROXY_BYPASS, 0);
    // Specify an HTTP server.
    if (hSession)
    {
        cout << "WinHttpOpenn";
        hConnect = WinHttpConnect(hSession, L"example.com", INTERNET_DEFAULT_HTTP_PORT, 0);
    }
    // Create an HTTP request handle.
    if (hConnect)
    {
        cout << "WinHttpConnectn";
        string req = "/script.php?data1=";
        req += DATA1;
        req += "&data2=";
        req += DATA2;
        req += '';
        WCHAR* str = new WCHAR(req.size() - 1);
        MultiByteToWideChar(0, 0, req.c_str(), req.size(), str, req.size());
        hRequest = WinHttpOpenRequest(hConnect, L"GET", str, NULL, WINHTTP_NO_REFERER, NULL, NULL);
    }
    // Send a request.
    if (hRequest)
    {
        cout << "WinHttpOpenRequestn";
        bResults = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);
    }
    // End the request.
    if (bResults)
    {
        cout << "WinHttpSendRequestn";
        bResults = WinHttpReceiveResponse(hRequest, NULL);
    }
    // Close any open handles.
    if (hRequest)
    {
        WinHttpCloseHandle(hRequest);
    }
    if (hConnect)
    {
        WinHttpCloseHandle(hConnect);
    }
    if (hSession)
    {
        WinHttpCloseHandle(hSession);
    }
}

现在我在这里的问题是大多数时候都会发生的事情,但并非总是如此。有时数据确实会发送,但是当我收到错误时,它看起来像这样:

检测到严重错误 c0000374 应用程序.exe已触发 断点。

申请.exe 0x77EFE653(ntdll.dll)的首次机会例外: 0xC0000374:堆已损坏(参数:0x77F34268)。

应用程序中0x77EFE653 (ntdll.dll) 处未处理的异常.exe: 0xC0000374:堆已损坏(参数:0x77F34268)。

这发生在吃WinHttpOpenRequestWinHttpSendRequest上。有没有人知道为什么大多数时候会发生这种情况?

注意:此代码中提到的域是假的,而不是真实代码中使用的域。

我在上面的评论中点击了 ChrisWard1000 的链接,现在它的工作原理是这样的:

if (hConnect)
{
    cout << "WinHttpConnectn";
    string req = "/script.php?data1=";
    req += DATA1;
    req += "&data2=";
    req += DATA2;
    req += '';
    int wchars_num = MultiByteToWideChar(CP_UTF8, 0, req.c_str(), -1, NULL, 0);
    wchar_t* str = new wchar_t[wchars_num];
    MultiByteToWideChar(0, 0, req.c_str(), req.size(), str, req.size());
    hRequest = WinHttpOpenRequest( hConnect, L"GET", str, NULL, WINHTTP_NO_REFERER, NULL, NULL);
    delete[] str;
}

+1 这个建议,谢谢你们。