Доброго всем времени суток.
Прочитал вчера статью "Введение в WinInet" Автор: Игорь Ткачёв
Скачал пример newsreader2.zip, и столкнулся с проблемой при запуске готового примера из папки Release и получил сразу прекращение работы программы
подробности проблемы:
Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: newsreader2.exe
Версия приложения: 0.0.0.0
Отметка времени приложения: 3b5e4338
Имя модуля с ошибкой: newsreader2.exe
Версия модуля с ошибкой: 0.0.0.0
Отметка времени модуля с ошибкой: 3b5e4338
Код исключения: c0000005
Смещение исключения: 0000130c
Версия ОС: 6.1.7600.2.0.0.256.1
Код языка: 1049
Дополнительные сведения 1: fd44
Дополнительные сведения 2: fd449d4677863837c7eff17842eb9a69
Дополнительные сведения 3: acfc
Дополнительные сведения 4: acfc81e04d78e24382ca28c077e9ad46
ПК OC WIN7 64x
Среда VS2010 pro
При пошаговой трассировки с входом в функции я дошел до метода char *GetData (char *lpszBuffer,DWORD dwSize,DWORD *lpdwBytesRead=NULL);
и получил сообщение "Unhandled exception at 0x013fa0b4 in newsreader2.exe: 0xC0000005: Access violation writing location 0x00000000."
Подскажите почему готовый пример не работает а при трассировки обнаружилась такая проблема если ничего не менялось.
Подскажите как исправить данную проблема.
Заранее всем очень благодарен.
Ради интереса скомпилировал проект в VS2008 и прогнал под отладчиком.
Все верно, приложение падает в GetData (char *lpszBuffer,DWORD dwSize,DWORD *lpdwBytesRead),
а именно — вот на этой строке: lpszBuffer[*lpdwBytesRead] = 0;
Потому что lpszBuffer = NULL.
Причины, думаю, найдете самостоятельно.
Re[2]: Проблемы с примером из статью "Введение в WinInet"
Здравствуйте, okman, Вы писали:
O>Здравствуйте, Chrek625.
O>Ради интереса скомпилировал проект в VS2008 и прогнал под отладчиком. O>Все верно, приложение падает в GetData (char *lpszBuffer,DWORD dwSize,DWORD *lpdwBytesRead), O>а именно — вот на этой строке: lpszBuffer[*lpdwBytesRead] = 0; O>Потому что lpszBuffer = NULL. O>Причины, думаю, найдете самостоятельно.
Ищу но пока честно говоря не смог найти
Был бы благодарен если подскажите еще немного.
Re[3]: Проблемы с примером из статью "Введение в WinInet"
Здравствуйте, Chrek625, Вы писали:
C>Ищу но пока честно говоря не смог найти C>Был бы благодарен если подскажите еще немного.
Скомпилируйте приложение и в пошаговом режиме пройдитесь по нему с отладчиком, наблюдая за
состоянием переменных — Вы все поймете (отладчик же имеется, надеюсь ?). Да и это само по себе очень полезно.
Кое-где возвращаются данные нулевой длины. Чтобы их принять, программа ошибочно пытается выделить буфер
нулевого размера. Естественно, получается нулевой указатель. Но это нигде не проверяется, поэтому последствия очевидны.
Примерно так.
Re[4]: Проблемы с примером из статью "Введение в WinInet"
Здравствуйте, okman, Вы писали:
O>Здравствуйте, Chrek625, Вы писали:
C>>Ищу но пока честно говоря не смог найти C>>Был бы благодарен если подскажите еще немного.
O>Скомпилируйте приложение и в пошаговом режиме пройдитесь по нему с отладчиком, наблюдая за O>состоянием переменных — Вы все поймете (отладчик же имеется, надеюсь ?). Да и это само по себе очень полезно.
O>Кое-где возвращаются данные нулевой длины. Чтобы их принять, программа ошибочно пытается выделить буфер O>нулевого размера. Естественно, получается нулевой указатель. Но это нигде не проверяется, поэтому последствия очевидны. O>Примерно так.
Этим я и занимаюсь уже второй день, но там слишком много взаимосвязей чтобы я смог сам понять где косяк.
Взял готовый пример называет
Re[4]: Проблемы с примером из статью "Введение в WinInet"
Здравствуйте, okman, Вы писали:
O>Здравствуйте, Chrek625, Вы писали:
C>>Ищу но пока честно говоря не смог найти C>>Был бы благодарен если подскажите еще немного.
O>Скомпилируйте приложение и в пошаговом режиме пройдитесь по нему с отладчиком, наблюдая за O>состоянием переменных — Вы все поймете (отладчик же имеется, надеюсь ?). Да и это само по себе очень полезно.
O>Кое-где возвращаются данные нулевой длины. Чтобы их принять, программа ошибочно пытается выделить буфер O>нулевого размера. Естественно, получается нулевой указатель. Но это нигде не проверяется, поэтому последствия очевидны. O>Примерно так.
Мне кажется что ошибка в методе GetDataSize но я не уверен, пока что это единственное чего я смог найти
Re[5]: Проблемы с примером из статью "Введение в WinInet"
Здравствуйте, Chrek625, Вы писали:
C>Мне кажется что ошибка в методе GetDataSize но я не уверен, пока что это единственное чего я смог найти
Ошибка не в самом методе, а в отсутствии проверок (код-то демонстрационный !).
GetDataSize возвращает 0 (то есть, размер полученных данных равен нулю). Почему это происходит — не знаю, не смотрел.
Статья-то старая, возможно, что по использованному URL новости уже читать нельзя. Подозреваю, что причина в этом.
Вряд ли автор статьи не перепроверил все раз пятнадцать.
Итак, GetDataSize возвращает 0. Это значение затем использует функция выделения памяти. Но выделить буфер
нулевого размера невозможно, поэтому та функция вместо указателя на область памяти возвращает нулевой указатель.
Но это все нигде не проверяется — происходит попытка записи по нулевому адресу, ведущая к краху приложения.
Re[6]: Проблемы с примером из статью "Введение в WinInet"
Здравствуйте, okman, Вы писали:
O>Здравствуйте, Chrek625, Вы писали:
C>>Мне кажется что ошибка в методе GetDataSize но я не уверен, пока что это единственное чего я смог найти
O>Ошибка не в самом методе, а в отсутствии проверок (код-то демонстрационный !). O>GetDataSize возвращает 0 (то есть, размер полученных данных равен нулю). Почему это происходит — не знаю, не смотрел. O>Статья-то старая, возможно, что по использованному URL новости уже читать нельзя. Подозреваю, что причина в этом. O>Вряд ли автор статьи не перепроверил все раз пятнадцать.
O>Итак, GetDataSize возвращает 0. Это значение затем использует функция выделения памяти. Но выделить буфер O>нулевого размера невозможно, поэтому та функция вместо указателя на область памяти возвращает нулевой указатель. O>Но это все нигде не проверяется — происходит попытка записи по нулевому адресу, ведущая к краху приложения.
Да читать такой урл как в примере уже не используется но я его заметил на новый, понятно ну вообще пойду дальше разбираться, спасибо за участие