Я начинающий, дошёл в уроках iczelion'a до отрисовки текста. Возможно я забегаю вперёд, но очень уж захотелось узнать, а как можно вывести текст из какого-нибудь файла текстового!? Подскажите пожалуйста!
Ну прямо невтерпеЖь! Для первого раза так: Код (Text): ;================================================================== .data buffer db 256 dup(0) filename db 'this_source.asm',0 ;================================================================== .code invoke CreateFile,addr filename,GENERIC_READ,0,0,OPEN_EXISTING,0,0 invoke ReadFile,eax,addr buffer,256,esp,0 invoke MessageBox,0,addr buffer,addr filename,0 ;================================================================== Теперь ждем от Вас сообщений о последовавших ошибках %)
А вот и всё замечательно откампилировалось и выполнилось :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 вывести а нарисовать в моём окне ?
Это туториал №5? Тогда совместим с ним, данные как есть: Код (Text): ;================================================================== .data buffer db 256 dup(0) filename db 'this_source.asm',0 ;================================================================== В коде убери что ты добавил, перед WM_DESTROY добавь такой кусок: Код (Text): ;================================================================== .IF uMsg == WM_CREATE invoke CreateFile,addr filename,GENERIC_READ,0,0,OPEN_EXISTING,0,0 invoke ReadFile,eax,addr buffer,255,esp,0 ;================================================================== .ELSEIF uMsg==WM_DESTROY invoke PostQuitMessage,NULL ... Потом в WM_PAINT найди строку "invoke TextOut,hdc,0,0,ADDR TestString,SIZEOF TestString" и замени на такую: Код (Text): invoke TextOut,hdc,0,0,ADDR buffer,255
На какое из сообщений происходит вызов CreateFile,ReadFile,MessageBox? После CreateFile и ReadFile неплохо бы сделать и CloseHandle, чтобы закрыть файл. Нарисовать в окне можно, получи hDC своего окна при помощи GetDC и рисуй на нем текст, используя апи DrawText. P.S. Используй кнопку "Код", когда постишь кусок кода, а то на курсив приходится голову вправо наклонять - шея болит после кода.
Ну всё, напугали человека хендлами, сообщениями ... Он только 5-й урок читает, а WM_CREATE используется в 9-м, файлы в 12-м, он все сразу не запомнит
Нет-нет.. i'me как грится айдестенд или как там В общем я росту и развиваюсь Однозначно пропитался позитивом к асамблеру и жителям сего форума, где ньюбисов не пинают ногами и не издеваются а как отцы своих детей просто.. ведут по тернистому пути программирования (эк меня после вчерашнего .. Ага! и почему в этот раз 255 а не 256, очепятка ? :/ АААААА!!!! ЭТО РАБОТАЕТ )) сейчас только со шрифтом разберусь, а то что то ироглифы какие то.
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") Учти - это простейший пример, тебе ещё надо проверять есть ли такой файл при открытии, какой его размер, есть ли в нем текст(обрабатывать ошибки), закрыть хендл когда он не нужен и мн. др. это зависит от того, что тебе с текстом надо делать
bogrus Спасибо большое за помошь. Чтобы не надоедать вопросами как записать в файл и т.д я продолжу читать уроки iczelion'а. Просто очень нужна была как бы это сказать... моя программа которая могла что то делать кроме как примитивно говорить хэлло ворлд... стимул своего рода.. а то мне началось казаться что я не справлюсь с асмом... на мой поверхностный взгляд он не на много сложнее с++.... посмотрим, будет ли он мне по зубам