Примеры из wininet
От: Аноним  
Дата: 26.09.09 15:44
Оценка:
calc
newsreader
Примеры вылетают с ошибкой, отладчик ругаеться на переменую lpszBuffer, куда я ее не двигал не помагало.

12.11.09 01:13: Перенесено модератором из 'C/C++' — Кодт
Re: Примеры из wininet
От: Кодт Россия  
Дата: 26.09.09 17:34
Оценка: :))) :)
Здравствуйте, Аноним, Вы писали:

А>calc

А>newsreader
А>Примеры вылетают с ошибкой, отладчик ругаеться на переменую lpszBuffer, куда я ее не двигал не помагало.

Телепаты тоже вылетели с ошибкой и ругаются на отсутствие конкретики в сообщении.
Хоть бы код привёл и что именно говорит отладчик.
Перекуём баги на фичи!
Re[2]: Примеры из wininet
От: adad  
Дата: 06.11.09 19:31
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Аноним, Вы писали:


А>>calc

А>>newsreader
А>>Примеры вылетают с ошибкой, отладчик ругаеться на переменую lpszBuffer, куда я ее не двигал не помагало.

К>Телепаты тоже вылетели с ошибкой и ругаются на отсутствие конкретики в сообщении.

К>Хоть бы код привёл и что именно говорит отладчик.
Отладчик вылетает с этим:
Unhandled exception at 0x0043c384 in newsreader2.exe: 0xC0000005: Access violation writing location 0x00000000.

Стопориться тут:
char *CHTTPReader::GetData (char *lpszBuffer,DWORD dwSize,DWORD *lpdwBytesRead)
{
    DWORD dwBytesRead;
    if (lpdwBytesRead == NULL)
        lpdwBytesRead = &dwBytesRead;
    *lpdwBytesRead = 0;

    if (m_hRequest) {
        bool bRead = ::InternetReadFile(
            m_hRequest,
            lpszBuffer,
            dwSize,
            lpdwBytesRead) != FALSE;
---->>        lpszBuffer[*lpdwBytesRead] = 0;

        return CheckError(bRead) && *lpdwBytesRead? lpszBuffer: NULL;
    }

    return NULL;
}

Ругаеться на две перменые:
m_lpszDataBuffer 0x00000000 <Bad Ptr>
CXX0030: Error: expression cannot be evaluated    
lpszBuffer 0x00000000 <Bad Ptr>
CXX0030: Error: expression cannot be evaluated

Ссылка на пример
Re[3]: Примеры из wininet
От: Vamp Россия  
Дата: 06.11.09 19:50
Оценка:
Похоже на то, что выходишь за границу lpszBuffer. Где он определяется? Чему равен dwSize?
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Примеры из wininet
От: Кодт Россия  
Дата: 08.11.09 22:13
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Похоже на то, что выходишь за границу lpszBuffer. Где он определяется? Чему равен dwSize?


Похоже, что никто никуда не выходит, а lpszBuffer тупо равна NULL.
Нужно посмотреть код, который
— устанавливает загадочную (нигде выше не упомянутую) m_lpszBuffer
— вызывает ReadBuffer() — и что туда передаёт в качестве lpszBuffer
Перекуём баги на фичи!
Re[5]: Примеры из wininet
От: adad  
Дата: 11.11.09 01:22
Оценка:
Где он определяется? Чему равен dwSize?

Ну походу тут:
char *GetData     (char *lpszBuffer,DWORD dwSize,DWORD *lpdwBytesRead=NULL);

При ошибке равна нулю:
dwSize 0 unsigned long


— устанавливает загадочную (нигде выше не упомянутую) m_lpszBuffer

Не знаю где вы ее нашли, но в коде ее не нашел.
Это что касаеться работыс буфером:
char *CHTTPReader::GetData (DWORD *lpdwBytesRead)
{
    DWORD dwDataSize = GetDataSize();
    SetDataBuffer(dwDataSize);    
    return GetData(
        m_lpszDataBuffer, 
        dwDataSize? dwDataSize: m_dwBufferSize, 
        lpdwBytesRead);
}


void CHTTPReader::SetDataBuffer (DWORD dwBufferSize)
{
    if (dwBufferSize > m_dwBufferSize) {
        delete m_lpszDataBuffer;
        m_lpszDataBuffer = new char[(m_dwBufferSize = dwBufferSize) + 1];
    }
}

Вот переменные которые ставяться в Null.
CHTTPReader::CHTTPReader(LPCTSTR lpszServerName,bool bUseSSL)
: m_hInternet(NULL),
  m_hConnection(NULL),
  m_hRequest(NULL),
  m_lpszServerName(NULL),
  m_lpszDefaultHeader(NULL),
  m_lpszDataBuffer(NULL),
  m_dwBufferSize(0),
  m_bUseSSL(bUseSSL),
  m_dwLastError(0)

Вообще то тут что то с размером буфера то есть программа съедает страницы маленькие, а с большими ошибка.
Я протестил на localhost она удачно приняла надпись hello world.
Re[6]: Примеры из wininet
От: ioni Россия  
Дата: 11.11.09 07:03
Оценка:
Здравствуйте, adad, Вы писали:

вообще то тут утечка
void CHTTPReader::SetDataBuffer (DWORD dwBufferSize)
{
    if (dwBufferSize > m_dwBufferSize) {
               delete m_lpszDataBuffer;        
        m_lpszDataBuffer = new char[(m_dwBufferSize = dwBufferSize) + 1];
    }
}
Re[6]: Примеры из wininet
От: Кодт Россия  
Дата: 11.11.09 14:00
Оценка:
Здравствуйте, adad, Вы писали:

A>Вообще то тут что то с размером буфера то есть программа съедает страницы маленькие, а с большими ошибка.

A>Я протестил на localhost она удачно приняла надпись hello world.

4 гипотезы:
1) Неправильный порядок действий, почему-то не выполнили инициализацию буфера (не обнуление, а размещение, я имею в виду).
2) Во время инициализации произошла ошибка, которую не обработали.
3) Подсунули не тот буфер (не того объекта CHTTPReader, например).
4) Расстреляли память — прокатились по стеку, по куче, по объекту CHTTPReader...

Я начал бы с того, что напихал всюду, где только возможно, ассертов.
Самых тривиальных:
— (this != NULL),
— (m_lpszDataBuffer != NULL),
— (m_lpszDataBuffer == lpszBuffer),
— (dwDataSize <= m_dwBufferSize)
— (lpdwBytesRead != NULL) непосредственно перед вызовом InternetReadFile
— (*lpdwBytesRead <= dwDataSize) непосредственно после вызова

Посмотрел бы на GetDataSize(). Нет ли ситуаций, когда эта функция возвращает мусор? Например, (DWORD)(-1) = 0xFFFFFFFF
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[7]: Примеры из wininet
От: adad  
Дата: 11.11.09 14:41
Оценка:
K>Посмотрел бы на GetDataSize(). Нет ли ситуаций, когда эта функция возвращает мусор? Например, (DWORD)(-1) = 0xFFFFFFFF
убрана кривая разметка цитирования. — Кодт

DWORD CHTTPReader::GetDataSize ()
{
    if (m_hRequest) {
        DWORD dwDataSize = 0;
        DWORD dwLengthDataSize = sizeof(dwDataSize);

        BOOL bQuery = ::HttpQueryInfo(
            m_hRequest,
            HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,
            &dwDataSize, 
            &dwLengthDataSize,
            NULL);

        return bQuery? dwDataSize: 0;
    }

    return 0;
}
Re[8]: Примеры из wininet
От: Кодт Россия  
Дата: 11.11.09 15:12
Оценка:
Здравствуйте, adad, Вы писали:

A>
A>DWORD CHTTPReader::GetDataSize ()
A>


Вроде написано правильно.

На будущее: не запихивай цитаты в тэг [code]!!!

Ассерты расставил? Дебаггер запустил? Подрывается на ассертах или по-прежнему access violation?
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[8]: Примеры из wininet
От: std.denis Россия  
Дата: 11.11.09 15:36
Оценка: +1
Вот блин устроили ромашку "Transfer-Encoding: chunked" там, поэтому HttpQueryInfo не может определить Content-Length.
Раз уж отладчик в руках, и видно, что указатель на буфер равен нулю, то неужели так сложно пройтись пошагово по коду запроса и получения ответа, проверяя ключевые переменные?
Re[9]: Примеры из wininet
От: adad  
Дата: 12.11.09 15:11
Оценка: :)
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, adad, Вы писали:


A>>
A>>DWORD CHTTPReader::GetDataSize ()
A>>


К>Вроде написано правильно.


К>На будущее: не запихивай цитаты в тэг [code]!!!


К>Ассерты расставил? Дебаггер запустил? Подрывается на ассертах или по-прежнему access violation?


Да эфект есть, изменил код примерно следующим образом

char *CHTTPReader::GetData (char *lpszBuffer,DWORD dwSize,DWORD *lpdwBytesRead)

{
    assert(this != NULL);
    assert(m_lpszDataBuffer != NULL);
    assert(m_lpszDataBuffer == lpszBuffer);
    assert(dwSize <= m_dwBufferSize);
    DWORD dwBytesRead;
    
    if (lpdwBytesRead == NULL)
        lpdwBytesRead = &dwBytesRead;
    *lpdwBytesRead = 0;
    assert(lpdwBytesRead != NULL);
    if (m_hRequest) {
        bool bRead = ::InternetReadFile(
            m_hRequest,
            lpszBuffer,
            dwSize,
            lpdwBytesRead) != FALSE;
        lpszBuffer[*lpdwBytesRead] = 0;
        assert(*lpdwBytesRead <= dwSize);
        return CheckError(bRead) && *lpdwBytesRead? lpszBuffer: NULL;
    }

    return NULL;
}


Вылетает при проверке m_lpszDataBuffer, тоесть она равняеться NULL.
Ставил ассерт перед вызовом InternetReadFile, так же срабатывает и перед строчкой на которой вылетает отладчик в первых постах, тоже срабатывает.
Проверив на NULL другие переменые которые там участвуют оказалось что lpszBuffer, dwSize тоже принимают Null перед вызовом InternetReadFile.
Re[10]: Примеры из wininet
От: Кодт Россия  
Дата: 13.11.09 09:30
Оценка:
Здравствуйте, adad, Вы писали:

AA>Ставил ассерт перед вызовом InternetReadFile, так же срабатывает и перед строчкой на которой вылетает отладчик в первых постах, тоже срабатывает.

A>Проверив на NULL другие переменые которые там участвуют оказалось что lpszBuffer, dwSize тоже принимают Null перед вызовом InternetReadFile.

Они "принимают значение" или оно там изначально было?
Но в любом случае, дальнейшая отладка будет тривиальной (если только это не адский запил по памяти).
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[11]: Примеры из wininet
От: std.denis Россия  
Дата: 13.11.09 15:48
Оценка:
К>Но в любом случае, дальнейшая отладка будет тривиальной (если только это не адский запил по памяти).
а мысль
Автор: std.denis
Дата: 11.11.09
о том, что буфер банально не создается (поэтому и равен NULL), из-за того что GetDataSize возвращает 0, из-за того что HttpQueryInfo возвращает ошибку, из-за того что ответ от сервера приходит с "Transfer-Encoding: chunked" не подходит в качестве причины?
Re[12]: Примеры из wininet
От: adad  
Дата: 16.11.09 13:10
Оценка:
Здравствуйте, std.denis, Вы писали:

К>>Но в любом случае, дальнейшая отладка будет тривиальной (если только это не адский запил по памяти).

SD>а мысль
Автор: std.denis
Дата: 11.11.09
о том, что буфер банально не создается (поэтому и равен NULL), из-за того что GetDataSize возвращает 0, из-за того что HttpQueryInfo возвращает ошибку, из-за того что ответ от сервера приходит с "Transfer-Encoding: chunked" не подходит в качестве причины?

Но страницы меньшего размера проходят, почему в других ситуациях буфер не создаеться?
Re[13]: Примеры из wininet
От: std.denis Россия  
Дата: 16.11.09 13:41
Оценка:
A>Но страницы меньшего размера проходят, почему в других ситуациях буфер не создается?
в этих случаях, когда все обрабатываются нормально, тоже присутствует "Transfer-Encoding: chunked" в ответах сервера?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.