![]() |
|
Модераторы: bsa |
![]()
|
|
| andreykeil |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 19.9.2008 Репутация: нет Всего: нет |
Всем здрасте!
Есть API-функция ReadFile:
Там третьим параметром передаётся необходимое число прочитанных байт - nNumberOfBytesToRead. При этом оговаривается, что число "nNumberOfBytesToRead" не должно быть больше размера буфера. Как узнать, какой размер буфера установлен в программе(в Windows-е)? Естественно, я его(буфер) не менял. |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: нет Всего: 47 |
Так, размер буфера ты же сам и устанавливаешь |
|||
|
||||
| andreykeil |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 19.9.2008 Репутация: нет Всего: нет |
Вопрос возник в связи с чтением Архангельского...
Может он путает что-то. Проясните, плиз. |
|||
|
||||
| eyeofhell |
|
|||
|
Адепт ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 16.10.2008 Где: Россия, Москва Репутация: 1 Всего: 1 |
|
|||
|
||||
| andreykeil |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 19.9.2008 Репутация: нет Всего: нет |
Не совсем поняли меня.
А если я укажу размер буфера 256000000 байт и его не окажется? Что тогда делать? |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
ничего не будет, функция вернет ошибку
Добавлено через 54 секунды andreykeil, найди описание функции в MSDN, там все расписано |
|||
|
||||
| eyeofhell |
|
|||
|
Адепт ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 16.10.2008 Где: Россия, Москва Репутация: 1 Всего: 1 |
Указывая размер буфера, Вы берете на себя обязательства предоставить память соответствующего размера. Если вы выделите 10 байт памяти char buffer[ 10 ], укажете ее и размер 256000000 байт - то функция ReadFile запишет 10 байт в buffer и начнет писать дальше в невыделенную память. Закончится это наверное access violation Как обычно делают: 1. Получают размер файла int size = GetFileSize( hFile, 0 ) 2. Выделяют память с помощью char* buffer = malloc( size ) 3. Считывают файл, в выделенную память с помощью ReadFile( ..., buffer, size, ... ) 4. Делают со считанным что надо 5. Освобождают память с помощью free( buffer ) |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
нет закончится это возвращением ошибки из функции, так как функция ReadFile выполняется в режиме ядра, и там не может быть в принципе ошибки доступа, но ф-я конечно-же проверяет указатель, переданный в нее это можно делать только для маленьких файлов, большие лучше читать по частям |
|||
|
||||
| eyeofhell |
|
|||
|
Адепт ![]() Профиль Группа: Участник Сообщений: 87 Регистрация: 16.10.2008 Где: Россия, Москва Репутация: 1 Всего: 1 |
Теологический вопрос. Конкретно с цифрой 256000000 функция действительно сначала убедится, что в эту память можно писать. И если давать буфер на стеке, размер которого ( стека ) растет динамически и обычно байт 20-30, то вернет 0. Но если сделать char buffer[ 2 ], ReadFile( buffer, 10 ) - то получим затираение стека с последующим возратном неизвестно куда и access violation при попытке исполнить там код. Так что не надо так делать (с) Это сообщение отредактировал(а) eyeofhell - 18.10.2008, 18:17 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |