Подскажите, как грамотно выделить память чтобы прочитать весь текстовый файл? Код (Text): .386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\macros\macros.asm include \masm32\macros\windows.asm uselib kernel32, masm32, user32 .data fname db "source.txt",0 .data? fHndl dd ? fSize dd ? hStr dd ? .code start: Invoke _lopen,addr fname,OF_READ mov fHndl,eax Invoke GetFileSize,fHndl,0 ;получаем размер файла mov fSize,eax Invoke VirtualAlloc,0,fSize,MEM_COMMIT,PAGE_READWRITE mov hStr,eax Invoke _lread,fHndl,hStr,sizeof hStr Invoke _lclose,fHndl invoke ExitProcess,0 end start Почему-то не работает, хотя ошибок нет. Я так предполагаю, что проблема в путанице с указателями после VirtualAlloc - я их не туда передаю или передаю не то. Функции _lopen и т.д. вместо CreateFile использую исключительно для быстроты разработки. Макрос Код (Text): mov hString, alloc$(byte_count) тоже не работает почему-то.
Это что^ - "sizeof hStr"? А вообще бросьте использовать устаревшие функции, либо напишите своё обёртку либо используйте из masmlib.
размер буфера для чтения. А чем это плохо? Они нестабильно работают или их уберут в след. версиях виндовс?
Попробуйте открывать файл через CreateFile, получать размер через GetFileSizeEx, а память распределять через HeapAlloc(GetProcessHeap). Так оно чуть более понятно и удобочитаемо будет.
Все дело у руках и грамотности . Езай GetLastError () Что будет ? не проверяя на вскидку? ERROR_INVALID_ADDRESS Делать надо так Код (Text): Invoke VirtualAlloc,0,fSize,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE totimoud А в соседнем топики вы еще что то про виртуальную память писать ... ахахахах
shchetinin Прогнивший какой то смех. Я спрашивал не чтобы узнать то, то что знаю досконально. Вы не разбираетесь в людях товарищ, определитесь кто есть кто вначале. По теме - нтстатус следует юзать, а не виньеррор. Последние совершенно не информативны.
M0rg0t sizeof hStr = 4 Остальное все правильно Или переходите на Си или перестаньте надеятся, что компилятор будет думать за вас. Или используйте отладчик Ollydbg - он вам сразу все покажет. И перестаньте свои догадки выносить в заголовок темы. С чего вы взяли что память не выделяется? Потому что читается 4 байта, а не все. Ха-ха-ха...
Спасибо, попробую. Ну как же это так? А на чем писать, на компонентах? А как надо? Как я понимаю, я вместо самого буфера передаю в _lread указатель на этот буфер? Но как передать сам буфер? Я что-то не могу понять... Олька ничего не показывает, никакие ерроры, поэтому решил обратится на форум. upd. Все сделал, всем спасибо за помощь. Код переписал так Invoke _lread,fHndl,hStr,fSize (указатель передал без addr, а размер взял там,где выделял память).