2015-01-06 4 views
-2

Я пытаюсь отправить некоторые данные в PHP скрипт из проекта ++ моих с так:HTTP-запросы вызывают кучевое повреждение?

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 << "WinHttpOpen\n"; 
     hConnect = WinHttpConnect(hSession, L"example.com", INTERNET_DEFAULT_HTTP_PORT, 0); 
    } 

    // Create an HTTP request handle. 
    if (hConnect) 
    { 
     cout << "WinHttpConnect\n"; 

     string req = "/script.php?data1="; 
     req += DATA1; 
     req += "&data2="; 
     req += DATA2; 
     req += '\0'; 

     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 << "WinHttpOpenRequest\n"; 
     bResults = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0); 
    } 

    // End the request. 
    if (bResults) 
    { 
     cout << "WinHttpSendRequest\n"; 
     bResults = WinHttpReceiveResponse(hRequest, NULL); 
    } 

    // Close any open handles. 
    if (hRequest) 
    { 
     WinHttpCloseHandle(hRequest); 
    } 

    if (hConnect) 
    { 
     WinHttpCloseHandle(hConnect); 
    } 

    if (hSession) 
    { 
     WinHttpCloseHandle(hSession); 
    } 
} 

Теперь моя проблема здесь что-то, что происходит в большинстве случаев, но не всегда. Иногда данные действительно присылают, но когда я получаю ошибку он выглядит следующим образом: обнаружен

Критическая ошибка c0000374 application.exe вызвала точку останова.

Исключение при первой возможности в 0x77EFE653 (ntdll.dll) в application.exe: 0xC0000374: Куча повреждена (параметры: 0x77F34268).

Необработанное исключение в 0x77EFE653 (ntdll.dll) в application.exe: 0xC0000374: Куча повреждена (параметры: 0x77F34268).

Это происходит на eather WinHttpOpenRequest или WinHttpSendRequest. Кто-нибудь имеет представление о том, почему это происходит большую часть времени?

примечание: домен, указанный в этом коде, является поддельным, а не тем, который используется в реальном коде.

+0

Попробуйте следующее: WCHAR * str = new WCHAR (req.size()); – ChrisWard1000

+0

, то я получаю: «Исключение первого шанса в 0x756EF80A (KernelBase.dll) в application.exe: 0xC0000005: место записи нарушения доступа 0x005B5000. Необработанное исключение в 0x756EF80A (KernelBase.dll) в application.exe: 0xC0000005: место записи нарушения доступа 0x005B5000.' – jt123

+1

Я думаю, вам нужно использовать MultiByteToWideChar, как описано в ответах здесь: https://stackoverflow.com/questions/ 6693010/problem-using-multibytetowidechar – ChrisWard1000

ответ

0

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

if (hConnect) 
{ 
    cout << "WinHttpConnect\n"; 

    string req = "/script.php?data1="; 
    req += DATA1; 
    req += "&data2="; 
    req += DATA2; 
    req += '\0'; 

    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 за это предложение, спасибо вам, ребята.