То есть я промепировал весь файл(invoke CreateFileMapping,hFile,NULL,PAGE_READONLY,0,0,NULL), затем пытаюсь прочитать кусок из этого файла и тут возникают проблемы. Например строчка invoke MapViewOfFile,hMapFile,FILE_MAP_READ,0,0,0 - работает так как надо, но она весь файл читает, а мне нужен кусок. Третий и четвертый параметр в MapViewOfFile якобы смещение, а пятый кол-во байт. Но когда я делаю что то в этом роде:MapViewOfFile,hMapFile,FILE_MAP_READ,0,2,0 - перестает вообще что либо выводить из файла. Еще один момент - конструкция типа MapViewOfFile,hMapFile,FILE_MAP_READ,0,0,5 у меня все равно читает ВЕСЬ файл, а не 5 байт как я хочу. С чем это связано и как это правильно делается?
Тамизвращения, но ответы на твой вопрос среди них есть. Только рассуждения про предел в 2Гб там потом не подтвердились - просто у меня на диске места не хватало, так что всё работает и с файлами любого размера.
Маппинг производится страницами по 4Кб, поэтому, во-первых, смещение должно быть кратно 4К иначе "the function fails", во-вторых, если размер файла меньше 4К, то он ес-но маппится целиком, если же больше, то 4К, но ни как не 5 байт "как ты хочешь"
Ну это уже как то проясняет ситуацию. Тогда такой вопрос: А как тогда мне "вырезать" из памяти именно 5 байт по нужному мне смещению (размер файла меньше 4Кб)?
Прибавь к указателю MapView нужное смещение и получишь указатель на свои 5 байт. Если хочешь можешь их скопировать в свой буфер через movsb
Я "смещу" толко начало, и файл все равно будет читаться от нового начала ДО КОНЦА (чего как раз мне ненадо). а вариант с movsb неработает. Может я чегото здесь недопонимаю? Вот код: Код (Text): mas db " " invoke MapViewOfFile,hMapFile,FILE_MAP_READ,0,0,0 mov mMemory,eax lea di,mas lea si,mMemory movsb invoke SetWindowText,hSuma,mas
Если не надо, то вместо маппинга юзай обычное чтение файла SetFilePointer + ReadFile Видимо да Код (Text): mas db 8 dup (0) invoke MapViewOfFile,hMapFile,FILE_MAP_READ,0,0,0 mov mMemory,eax mov esi,eax lea edi,[mas] mov [edi+5],0 ;замык.ноль mov ecx,5 rep movsb
Наконец-то! Заработало именно так как я и хотел. Спасибо большое! п.с. mov [edi+5],0 - здесь я прокоментировал(убрал строку), потому что компилятор на нее ругался "invalid instruction operand"
sheef_ad Дык и используй соответствующие функции SetFilePointer, ReadFile, а файловый маппинг придуман совсем не для твоих целей . А прибавить смещение тебе leo советовал после прочтения страницы, а не чтобы "сместить чтение", и в movsb используй esi, edi, а не их 16 разрядные версии.