Не могу грамотно выделить память.

Тема в разделе "WASM.BEGINNERS", создана пользователем M0rg0t, 4 фев 2012.

  1. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.582
    Подскажите, как грамотно выделить память чтобы прочитать весь текстовый файл?

    Код (Text):
    1. .386                      
    2. .model flat, stdcall      
    3. option casemap :none      
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\macros\macros.asm
    7. include \masm32\macros\windows.asm
    8. uselib kernel32, masm32, user32
    9.  
    10. .data
    11. fname db "source.txt",0
    12.  
    13. .data?
    14. fHndl dd ?
    15. fSize dd ?
    16. hStr dd ?
    17.  
    18. .code
    19. start:
    20. Invoke _lopen,addr fname,OF_READ
    21. mov fHndl,eax
    22. Invoke GetFileSize,fHndl,0 ;получаем размер файла
    23. mov fSize,eax
    24. Invoke VirtualAlloc,0,fSize,MEM_COMMIT,PAGE_READWRITE
    25. mov hStr,eax
    26. Invoke _lread,fHndl,hStr,sizeof hStr
    27. Invoke _lclose,fHndl
    28. invoke ExitProcess,0
    29. end start
    Почему-то не работает, хотя ошибок нет. Я так предполагаю, что проблема в путанице с указателями после VirtualAlloc - я их не туда передаю или передаю не то.
    Функции _lopen и т.д. вместо CreateFile использую исключительно для быстроты разработки.

    Макрос
    Код (Text):
    1. mov hString, alloc$(byte_count)
    тоже не работает почему-то.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Это что^ - "sizeof hStr"?
    А вообще бросьте использовать устаревшие функции, либо напишите своё обёртку либо используйте из masmlib.
     
  3. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.582
    размер буфера для чтения.
    А чем это плохо? Они нестабильно работают или их уберут в след. версиях виндовс?
     
  4. Incidence

    Incidence New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2011
    Сообщения:
    236
    Адрес:
    Kiev, UA
    Попробуйте открывать файл через CreateFile, получать размер через GetFileSizeEx, а память распределять через HeapAlloc(GetProcessHeap).
    Так оно чуть более понятно и удобочитаемо будет.
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    M0rg0t
    Вполне возможно. Как например убрали 8 битные форматы изображений в win7.

    Но зачем 4 байта? :)
     
  6. totimoud

    totimoud New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2012
    Сообщения:
    78
    Никак, учитывая что вам нужно на виньапи. На нём не возможно решить сие грамотно.
     
  7. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Все дело у руках и грамотности .

    Езай GetLastError ()

    Что будет ? не проверяя на вскидку? ERROR_INVALID_ADDRESS

    Делать надо так
    Код (Text):
    1. Invoke VirtualAlloc,0,fSize,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE
    totimoud
    А в соседнем топики вы еще что то про виртуальную память писать ... ахахахах
     
  8. totimoud

    totimoud New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2012
    Сообщения:
    78
    shchetinin
    Прогнивший какой то смех. Я спрашивал не чтобы узнать то, то что знаю досконально. Вы не разбираетесь в людях товарищ, определитесь кто есть кто вначале.
    По теме - нтстатус следует юзать, а не виньеррор. Последние совершенно не информативны.
     
  9. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    M0rg0t
    sizeof hStr = 4
    Остальное все правильно :)

    Или переходите на Си или перестаньте надеятся, что компилятор будет думать за вас.
    Или используйте отладчик Ollydbg - он вам сразу все покажет.
    И перестаньте свои догадки выносить в заголовок темы. С чего вы взяли что память не выделяется?
    Потому что читается 4 байта, а не все. Ха-ха-ха...
     
    M0rg0t нравится это.
  10. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.582
    Спасибо, попробую.
    Ну как же это так? А на чем писать, на компонентах?

    А как надо? Как я понимаю, я вместо самого буфера передаю в _lread указатель на этот буфер? Но как передать сам буфер? Я что-то не могу понять...

    Олька ничего не показывает, никакие ерроры, поэтому решил обратится на форум.

    upd. Все сделал, всем спасибо за помощь.
    Код переписал так
    Invoke _lread,fHndl,hStr,fSize (указатель передал без addr, а размер взял там,где выделял память).