Вывр\од текста из файла

Тема в разделе "WASM.BEGINNERS", создана пользователем tsf, 13 июл 2005.

  1. tsf

    tsf New Member

    Публикаций:
    0
    Регистрация:
    3 май 2005
    Сообщения:
    6
    Я начинающий, дошёл в уроках iczelion'a до отрисовки текста. Возможно я забегаю вперёд, но очень уж захотелось узнать, а как можно вывести текст из какого-нибудь файла текстового!? Подскажите пожалуйста!
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Ну прямо невтерпеЖь! Для первого раза так:
    Код (Text):
    1. ;==================================================================
    2. .data
    3. buffer    db 256 dup(0)
    4. filename  db 'this_source.asm',0
    5. ;==================================================================
    6. .code
    7. invoke  CreateFile,addr filename,GENERIC_READ,0,0,OPEN_EXISTING,0,0
    8. invoke  ReadFile,eax,addr buffer,256,esp,0
    9. invoke  MessageBox,0,addr buffer,addr filename,0
    10. ;==================================================================
    Теперь ждем от Вас сообщений о последовавших ошибках %)
     
  3. tsf

    tsf New Member

    Публикаций:
    0
    Регистрация:
    3 май 2005
    Сообщения:
    6
    А вот и всё замечательно откампилировалось и выполнилось

    :P Только проблема в следующем.. я даже после того как закрыл программу, не могу редактировать текстовой файл.. до собственно и сам исходник немогу перекомпилировать. ТОбиш не выгружается он из памяти... и при запуске несколько раз на кнопку ок нажимаю прежде чем он исчезнет... что то не так в логике программы как я понимаю

    :/

    WndProc proc hwnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

    LOCAL hdc:HDC

    LOCAL ps:PAINTSTRUCT

    LOCAL hfont:HFONT

    .if uMsg==WM_DESTROY

    invoke PostQuitMessage,NULL

    .elseif

    invoke CreateFile,addr tfile,GENERIC_READ,0,0,OPEN_EXISTING,0,0

    invoke ReadFile,eax,addr buffer,256,esp,0

    invoke MessageBox,0,addr buffer,addr tfile,0

    .else

    invoke DefWindowProc,hwnd,uMsg,wParam,lParam

    ret

    .endif

    xor eax,eax

    ret



    WndProc endp


    И ещё немного усложню свой вопрос, можно это не простым msgBox вывести а нарисовать в моём окне ?
     
  4. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Это туториал №5? Тогда совместим с ним, данные как есть:
    Код (Text):
    1. ;==================================================================
    2. .data
    3. buffer    db 256 dup(0)
    4. filename  db 'this_source.asm',0
    5. ;==================================================================
    В коде убери что ты добавил, перед WM_DESTROY добавь такой кусок:
    Код (Text):
    1. ;==================================================================
    2. .IF uMsg == WM_CREATE
    3.          invoke  CreateFile,addr filename,GENERIC_READ,0,0,OPEN_EXISTING,0,0
    4.          invoke  ReadFile,eax,addr buffer,255,esp,0
    5. ;==================================================================
    6. .ELSEIF uMsg==WM_DESTROY
    7.          invoke PostQuitMessage,NULL
    8. ...
    Потом в WM_PAINT найди строку "invoke TextOut,hdc,0,0,ADDR TestString,SIZEOF TestString" и замени на такую:
    Код (Text):
    1. invoke TextOut,hdc,0,0,ADDR buffer,255
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    На какое из сообщений происходит вызов CreateFile,ReadFile,MessageBox?



    После CreateFile и ReadFile неплохо бы сделать и CloseHandle, чтобы закрыть файл.



    Нарисовать в окне можно, получи hDC своего окна при помощи GetDC и рисуй на нем текст, используя апи DrawText.





    P.S.

    Используй кнопку "Код", когда постишь кусок кода, а то на курсив приходится голову вправо наклонять - шея болит после кода.
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    А кто за вас CloseHandle вызывать будет?!
     
  7. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Ну всё, напугали человека хендлами, сообщениями ... :)

    Он только 5-й урок читает, а WM_CREATE используется в 9-м, файлы в 12-м, он все сразу не запомнит :)
     
  8. tsf

    tsf New Member

    Публикаций:
    0
    Регистрация:
    3 май 2005
    Сообщения:
    6
    Нет-нет.. i'me как грится айдестенд или как там :) В общем я росту и развиваюсь :lol: Однозначно пропитался позитивом к асамблеру и жителям сего форума, где ньюбисов не пинают ногами и не издеваются:) а как отцы своих детей просто.. ведут по тернистому пути программирования (эк меня после вчерашнего :)..

    Ага! и почему в этот раз
    255 а не 256, очепятка ? :/

    АААААА!!!! ЭТО РАБОТАЕТ :))) сейчас только со шрифтом разберусь, а то что то ироглифы какие то.
     
  9. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    tsf




    Все текстовые ASCII строки должны заканчиваться нулем, UNICОDE двумя нулями, это мы должны были предусмотреть чтобы в "buffer db 256 dup(0)" оставался нуль, я забыл это сделать в первом посте, там надо поставить "ReadFile,eax,addr buffer,255,esp,0", тогда в буфер запишется 255 байт из файла, а 256-й как раз останется нулем (конечно ещё можно 0 записать самому через "mov byte ptr buffer+255,0")



    Учти - это простейший пример, тебе ещё надо проверять есть ли такой файл при открытии, какой его размер, есть ли в нем текст(обрабатывать ошибки), закрыть хендл когда он не нужен и мн. др. это зависит от того, что тебе с текстом надо делать
     
  10. tsf

    tsf New Member

    Публикаций:
    0
    Регистрация:
    3 май 2005
    Сообщения:
    6
    bogrus

    Спасибо большое за помошь. Чтобы не надоедать вопросами как записать в файл и т.д я продолжу читать уроки iczelion'а. Просто очень нужна была как бы это сказать... моя программа которая могла что то делать кроме как примитивно говорить хэлло ворлд... стимул своего рода.. а то мне началось казаться что я не справлюсь с асмом... на мой поверхностный взгляд он не на много сложнее с++.... посмотрим, будет ли он мне по зубам :)