|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июл 10, 2003 17:15:58 Доброго Всем утра, дня и вечера!! У меня собственно вот какая проблема! Переписываю пример программы из книги и начинаю компилить, вроде при компиляции все нормально идет, но когда я запускаю экзешник - выдается сообщение об ошибке и все!(окно даже не появл..) Я прогнал этот экзешник под дебагером и увидел, что при вызове функции CreateWindowExA происходит ошибка!! Мои предположения остановились на том что неправильно(автор опечатолся) написан параметр dwStyle В предыдущих примерах это параметр равнялся : WS_OVERLAPPEDWINDOW EQU 000CF0000H и все работало!!!!!!! а в этом(примере): WS_TABSTOP EQU 10000H WS_SYSMENU EQU 80000H WS_OVERLAPPEDWINDOW EQU WS_TABSTOP+WS_SYSMENU может ли это быть из-за этого??? Программа должна выводить окно с кнопкой выхода и списком!! И вот как раз еще один вопрос возник! как определяются эти значения для WS_TABSTOP, WS_SYSMENU?? или это постоянный??? так почему они не где не написаны(я про хелп)?? или я плохо смотрел(у меня хелп от си)?? Подскажите где мне искать эти константы? Пожалуйста напишите ответ, как можно полнее!!(я все таки еще учусь) или укажите где посмотреть?? Заранее благодарен!!!!! :) |
|
|
Дата: Июл 10, 2003 18:18:24 Константы типа WS_xxx - это принадлежность системы - меняться оне не могут. Конечно же, WS_OVERLAPPEDWINDOW не есть WS_TABSTOP+WS_SYSMENU. Просто автору надо было передать эти параметры, вот он и заменил WS_OVERLAPPEDWINDOW. Все константы для WINDOWS должны находится в одном из файлов, который должен быть в пакете АSSEMLER-a, который Вы используете. Далее, WS_TABSTOP обычно используется для элементов диалогового окна. Попробуйте заменить на WS_POPUP+WS_SYSMENU. Неплохо было бы посмотреть на Ваш код полностью. Здесь есть неплохие примеры кода: http://spiff.tripnet.se/~iczelion/tutorials.html |
|
|
Дата: Июл 10, 2003 18:30:06 · Поправил: Безпощадный даос Код нужен!? да пожалуста!! list.inc WM_SETFOCUS EQU 7H WM_DESTROY EQU 2 WM_CREATE EQU 1 WM_COMMAND EQU 111H WM_SETTEXT EQU 0CH WM_GETTEXT EQU 0DH LB_ADDSTRING EQU 180H LB_GETTEXT EQU 189H LB_GETCURSEL EQU 188H LBN_DBLCLK EQU 2 CS_VREDRAW EQU 1H CS_HREDRAW EQU 2H CS_GLOBALCLASS EQU 4000H WS_TABSTOP EQU 10000H WS_SYSMENU EQU 80000H WS_THICKFRAME EQU 40000H WS_OVERLAPPEDWINDOW EQU WS_TABSTOP+WS_SYSMENU STYLE EQU CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS BS_DEFPUSHBUTTON EQU 1H WS_VISIBLE EQU 10000000H WS_CHILD EQU 40000000H WS_BORDER EQU 800000H WS_VSCROLL EQU 200000H LBS_NOTIFY EQU 1H STYLBTN EQU WS_CHILD+BS_DEFPUSHBUTTON+WS_VISIBLE+WS_TABSTOP STYLLST EQU WS_THICKFRAME+WS_CHILD+WS_VISIBLE+WS_BORDER+WS_TABSTOP+W S_VSCROLL+LBS_NOTIFY IDI_APPLICATION EQU 32512 IDC_ARROW EQU 32512 SW_SHOWNORMAL EQU 1 EXTERN SetFocus:NEAR EXTERN SendMessageA:NEAR EXTERN MessageBoxA:NEAR EXTERN CreateWindowExA:NEAR EXTERN DefWindowProcA:NEAR EXTERN DispatchMessageA:NEAR EXTERN ExitProcess:NEAR EXTERN GetMessageA:NEAR EXTERN GetModuleHandleA:NEAR EXTERN LoadCursorA:NEAR EXTERN LoadIconA:NEAR EXTERN PostQuitMessage:NEAR EXTERN RegisterClassA:NEAR EXTERN ShowWindow:NEAR EXTERN TranslateMessage:NEAR EXTERN UpdateWindow:NEAR MSGSTRUCT STRUC MSHWND DD ? MSMESSAGE DD ? MSWPARAM DD ? MSLPARAM DD ? MSTIME DD ? MSPT DD ? MSGSTRUCT ENDS WNDCLASS STRUC CLSSTYLE DD ? CLWNDPROC DD ? CLSCBCLSEX DD ? CLSCBWNDEX DD ? CLSHINST DD ? CLSHICON DD ? CLSHCURSOR DD ? CLBKGROUND DD ? CLMENNAME DD ? CLNAME DD ? WNDCLASS ENDS list.asm .386P .MODEL FLAT, STDCALL INCLUDE list.inc INCLUDELIB C:\Temp\Tasm\Lib\Import32.lib _DATA SEGMENT DWORD PUBLIC USE32 'DATA' NEWHWND DD 0 MSG MSGSTRUCT <?> WC WNDCLASS <?> HINST DD 0 TITLENAME DB 'Пример - окно LISTBOX',0 CLASSNAME DB 'CLASS32',0 CPBUT DB 'Выход',0 CPLST DB '',0 CLSBUTN DB 'BUTTON',0 CLSLIST DB 'LISTBOX',0 HWNDBTN DD 0 HWNDLST DD 0 CAP DB 'Сообщение',0 CAP1 DB 'Выбран',0 MES DB 'Конец работы программы',0 STR1 DB 'Красный',0 STR2 DB 'Зеленый',0 STR3 DB 'Синий',0 STR4 DB 'Желтый',0 STR5 DB 'Черный',0 STR6 DB 'Белый',0 PS DWORD OFFSET STR1 DWORD OFFSET STR2 DWORD OFFSET STR3 DWORD OFFSET STR4 DWORD OFFSET STR5 DWORD OFFSET STR6 BUF DB 30 DUP(0) _DATA ENDS _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: PUSH 0 CALL GetModuleHandleA MOV [HINST],EAX REG_CLASS: MOV [WC.CLSSTYLE],STYLE MOV [WC.CLWNDPROC],OFFSET WNDPROC MOV [WC.CLSCBCLSEX],0 MOV [WC.CLSCBWNDEX],0 MOV EAX,[HINST] MOV [WC.CLSHINST],EAX PUSH IDI_APPLICATION PUSH 0 CALL LoadIconA MOV [WC.CLSHICON],EAX PUSH IDC_ARROW PUSH 0 CALL LoadCursorA MOV [WC.CLSHCURSOR],EAX MOV [WC.CLBKGROUND],17 MOV DWORD PTR [WC.CLMENNAME],0 MOV DWORD PTR [WC.CLNAME],OFFSET CLASSNAME PUSH OFFSET WC CALL RegisterClassA PUSH 0 PUSH [HINST] PUSH 0 PUSH 0 PUSH 150 PUSH 400 PUSH 100 PUSH 100 PUSH WS_OVERLAPPEDWINDOW PUSH OFFSET TITLENAME PUSH OFFSET CLASSNAME PUSH 0 CALL CreateWindowExA CMP EAX,0 JZ _ERR MOV [NEWHWND],EAX PUSH SW_SHOWNORMAL PUSH [NEWHWND] CALL ShowWindow PUSH [NEWHWND] CALL UpdateWindow MSG_LOOP: PUSH 0 PUSH 0 PUSH 0 PUSH OFFSET MSG CALL GetMessageA CMP EAX,0 JE END_LOOP PUSH OFFSET MSG CALL TranslateMessage PUSH OFFSET MSG CALL DispatchMessageA JMP MSG_LOOP END_LOOP: PUSH [MSG.MSWPARAM] CALL ExitProcess _ERR: JMP END_LOOP WNDPROC PROC PUSH EBP MOV EBP,ESP PUSH EBX PUSH EDI PUSH ESI CMP DWORD PTR [EBP+0CH],WM_DESTROY JE WMDESTROY CMP DWORD PTR [EBP+0CH],WM_CREATE JE WMCREATE CMP DWORD PTR [EBP+0CH],WM_COMMAND JE WMCOMMAND JMP DEFWNDPROC WMCOMMAND: MOV EAX,HWNDBTN CMP DWORD PTR [EBP+14H],EAX JE WMDESTROY MOV EAX,HWNDLST CMP DWORD PTR [EBP+14H],EAX JNE NOLIST CMP WORD PTR [EBP+12H],LBN_DBLCLK JNE NOLIST PUSH 0 PUSH 0 PUSH LB_GETCURSEL PUSH HWNDLST CALL SendMessageA PUSH 0 PUSH OFFSET CAP1 PUSH OFFSET BUF PUSH DWORD PTR [EBP+08H] CALL MessageBoxA NOLIST: MOV EAX,0 JMP FINISH WMCREATE: PUSH 0 PUSH [HINST] PUSH 0 PUSH DWORD PTR [EBP+08H] PUSH 20 PUSH 60 PUSH 10 PUSH 10 PUSH STYLBTN PUSH OFFSET CPBUT PUSH OFFSET CLSBUTN PUSH 0 CALL CreateWindowExA MOV HWNDBTN,EAX PUSH 0 PUSH [HINST] PUSH 0 PUSH DWORD PTR [EBP+08H] PUSH 90 PUSH 150 PUSH 50 PUSH 10 PUSH STYLLST PUSH OFFSET CPLST PUSH OFFSET CLSLIST PUSH 0 CALL CreateWindowExA MOV HWNDLST,EAX PUSH PS PUSH 0 PUSH LB_ADDSTRING PUSH HWNDLST CALL SendMessageA PUSH PS+4 PUSH 0 PUSH LB_ADDSTRING PUSH HWNDLST CALL SendMessageA PUSH PS+8 PUSH 0 PUSH LB_ADDSTRING PUSH HWNDLST CALL SendMessageA PUSH PS+12 PUSH 0 PUSH LB_ADDSTRING PUSH HWNDLST CALL SendMessageA PUSH PS+16 PUSH 0 PUSH LB_ADDSTRING PUSH HWNDLST CALL SendMessageA PUSH PS+20 PUSH 0 PUSH LB_ADDSTRING PUSH HWNDLST CALL SendMessageA MOV EAX,0 JMP FINISH DEFWNDPROC: PUSH DWORD PTR [EBP+14H] PUSH DWORD PTR [EBP+10H] PUSH DWORD PTR [EBP+0CH] PUSH DWORD PTR [EBP+08H] CALL DefWindowProcA WMDESTROY: PUSH 0 PUSH OFFSET CAP PUSH OFFSET MES PUSH DWORD PTR [EBP+08H] CALL MessageBoxA PUSH 0 CALL PostQuitMessage MOV EAX,0 FINISH: POP ESI POP EDI POP EBX RET 16 WNDPROC ENDP _TEXT ENDS END START |
|
|
Дата: Июл 10, 2003 18:34:14 я тасмом компилю - где там эти константы?? |
|
|
Дата: Июл 10, 2003 19:20:40 У мнея еще один вопрос!! может и туповат он, но все же! Как в масме создавать файл листинга!?? я уже перепробовал все команды, но уверен все не правильно я делал так "ml /c /coff /Fl name.asm" и т.д. ?? |
|
|
Дата: Июл 10, 2003 21:29:43 В ТASM5 есть несколько директорий - ищите файлы с расширением INC. Есть файл WINDOWS.INC (16-бит) и W32.INC (32-бит) - вот этот второй и надо использовать. Кроме того: CALL DefWindowProcA WMDESTROY: PUSH 0 Любое необработанное сообщение провалится в вызов PostQuitMessage(). Наверное, здесь не хватает "JMP FINISH": CALL DefWindowProcA JMP FINISH WMDESTROY: PUSH 0 |
|
|
Дата: Июл 11, 2003 02:41:38 [ Sergey: Как в масме создавать файл листинга!?? ] \masm32\bin\ml /c /coff /Fl /Sn /Sc name.asm |
|
|
Дата: Июл 11, 2003 18:03:21 Four-F спасибо!! AsmGuru62 Вам тоже спасибо!! насчет джампа я конечно же промухал!:) Но поставив его, прога все равно не хочет работать!!! Я посмотрел Инковские файлв и нашел в них строки WS_SYSMENU и WS_TABSTOP , так что интересно, в масме они равны 80000H и 100000H соответственно, а в тасме наоборот(правда в тасме они пределены директивой "=", а в масме "equ" - может из-за этого) 00008H и 00001H!!!Почему?? Я пробовал и те и те варианты ВСЕ равно ничего не пашет! пробовал, также компилить и под тасм, и под масм!! Не пашет хоть ты тресни!!! Выдает сообщение что приложение вызвало ошибку и будет закрыто!!! ???? !!!Помогите пожалуста!!! Мне эта программа спать спокойно не дает!! Заранее благодарен!! |
|
|
Дата: Июл 11, 2003 20:00:57 'equ' работает также как и '=' - там отличие в другом. Странно, что значения разные для разных пакетов!!.. Из 'Visual C++' видно, что: #define WS_SYSMENU 0x00080000L #define WS_TABSTOP 0x00010000L Так что MASM верен в этом случае. Я попробую прогнать этот код. |
|
|
Дата: Июл 11, 2003 22:47:40 Сравни вот это на входе WNDPROC: WNDPROC PROC PUSH EBP MOV EBP,ESP PUSH EBX PUSH EDI PUSH ESI С вот этим на выходе: FINISH: POP ESI POP EDI POP EBX RET 16 Как видно нет соответствующего кода восстановления стека. FINISH: POP ESI POP EDI POP EBX MOV ESP, EBP POP EBP RET 16 И еще совет: найди лучшие исходники для учебы. В этом уж слишком много клизм... |
|
|
Дата: Июл 12, 2003 02:12:02 Не работает потому, что определено WS_SYSMENU без WS_CAPTION, где sysmenu то будет если заголовка окна нет? Сделай WS_OVERLAPPEDWINDOW EQU WS_TABSTOP or WS_SYSMENU or WS_CAPTION Или SYSMENU убери, тогда без заголовка будет |
|
|
Дата: Июл 12, 2003 14:33:00 Спасибо Всем огромное, ДРУЗЬЯ!!! век не забуду! Благодара Вашим советам все заработало!! УРРААА!! :) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.036 |