Не могу прочитать файл в выделенный блок памяти... Код (Text): proc ReadF filename invoke CreateFile,[filename],GENERIC_READ or GENERIC_WRITE,\ FILE_SHARE_READ or FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,0 ; открываем файл cmp eax,-1 ; если ошибка открытия jne no_error ; выводим ошибку на экран stdcall ERROR_MESSAGE jmp ..exit ; и выходим no_error: mov [hFile],eax ; сохраняем дескриптор файла invoke GetFileSize,[hFile],FileSizeHigh ; получаем размер открытого файла mov [FileSize],eax cmp [FileSizeHigh],0 ; если FileSizeHigh имеет какое нить значение отличное от нуля ja FileSizeAbove ; значит файл больше 4Гб что нас не устраивает cmp eax,104857600 ; если он превышает 100мб то вывод сообщения ja FileSizeAbove stdcall HeapC,eax ; если файл меньше то выделяем память под него or eax,eax je ..exit ; если ошибка резервирования памяти выход mov [hHeap],eax ; память выделеного блока равна div(FileSize++,PageSize)*PageSize invoke HeapAlloc,eax,HEAP_ZERO_MEMORY,0 ; выделяем память для работы or eax,eax je ..exit ; если ошибка выделения памяти выход mov [pHeap],eax ; сохраняем указатель на кучу invoke ReadFile,[hFile],eax,[FileSize],dwFileReadSize,0 ; считываем файл в память jmp ..exit FileSizeAbove: invoke CloseHandle,[hFile] ; закрываем файл invoke MessageBox,0,szErrorFileAbove,szErrorWin,MB_OK or MB_ICONERROR ..exit: ret endp ;-------------------------------------------------------------- ; функция резервирует оперативную память целыми страницами ;-------------------------------------------------------------- proc HeapC SizeOfHeap xor edx,edx mov eax,[SizeOfHeap] mov ebx,[SysInfo.dwPageSize] div ebx inc eax mul ebx mov [HeapS],eax invoke HeapCreate,HEAP_NO_SERIALIZE,eax,0 ret endp Ошибка возникает когда я пытаюсь прочитать файл в указанный буфер созданный HeapAlloc. Объясните что я делаю не так...
создать отдельную кучу размера с файл, выделить на ней ноль байт и потом удивляться, чеж возникает ошибка)))... и кстати что мешает пользовать кучу процесса? я смотрю вы такой амбициозный программист))) не оперативную, а виртуальную))) и если уж так хочется выделять непрерывные участки виртуальной памяти страницами, то зачем использовать для этого кучу? можно выделить необходимое количество страниц виртуальной памяти соответствующими функциями (VirtualAlloc и тд), или еще лучше сделать отображение файла в память... здается мне вам необходимо почитать про организацию виртуальной памяти... и в частности про то, чем куча не является...
Спасибо за подсказку... Только вот объясните пожалуйста зачем тогда в HeapCreate надо указывать размер? Я так чет и не понял и там, и там указываешь... А по поводу коментов скажу что я их для себя пишу...))) Если на то пошло, то под словом резервирует я и хотел показать что он ее еще не выделил, а только зарезервировал...)))
это куча... она может разростаться и уменьшаться в размерах... в зависимости от того, какое количество выделенной на ней памяти используется в данный момент, сколько в ней непрерывных блоков и тд... при создании кучи можно задать соответственно минимальный и максимальный ее размер...
Я еще только начинающий "програмист", объясните пож есть ли какое нить преимущество в использовании кучи процесса? В дальнейшем у меня куча будет расти вверх, можно как-то этого добится с помощью VirtualAlloc? Заранее спасибо! P.S. Не хотелось бы выделить функцией VirtualAlloc много памяти, а потом по мере необходимости пользоваться ей...
а есть ли какое-нить преимущество в создании собственной кучи? и зачем отключать сериализацию? нет никак... по понятным причинам VirtualReAlloc не существует...
Я просто привык что для работы с памятью ее надо выделить... Попробую почитать про работу с кучей процесса... Литературу не подскажете?
Painter При создании каждого процесса загрузчик создаёт т.н. кучу по умолчанию. Т.е. она уже есть и является растущей. Получить хэндл кучи по умолчанию можно вызовом GetProcessHeap. Поэтому вызывать HeapCreate имеет смысл разве что при создании нестандартной кучи. Например, создание кучи статического размера или указание флага HEAP_NO_SERIALIZE, который может слегка ускорить работу с кучей, но при этом необходимо самостоятельно гарантировать, что никакие два потока не будут обращаться к куче одновременно. Но в большинстве случаев достаточно просто вызывать GetProcessHeap и радоваться куче по умолчанию. Ах да. Лучшая литература в данном случае — MSDN.