Не правильно компилирую или допустил ошибку?

Тема в разделе "WASM.BEGINNERS", создана пользователем splinter, 22 апр 2009.

  1. splinter

    splinter New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    45
    собсно вот код простенькой программы:

    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
    6.  
    7. include \masm32\include\windows.inc
    8. include \masm32\include\user32.inc
    9. include \masm32\include\kernel32.inc
    10.  
    11. includelib \masm32\lib\user32.lib
    12. includelib \masm32\lib\kernel32.lib
    13.  
    14. .data
    15. DlgName             db 'IDD_DLG1',0
    16. MessText            db 'Тыщ!',0
    17. MessCap         db 'Хеловорд :)',0
    18. MessText2       db 'Выходим нах!',0
    19. .data?
    20. HINST dd ?
    21. .const
    22. IDD_DLG1        equ 1000
    23. IDC_BTN1        equ 1001
    24. DC_BTN2         equ 1002
    25. IDC_EXIT        equ 3002
    26.  
    27. .code
    28. start:
    29.     INVOKE GetModuleHandle,NULL
    30.     mov HINST,eax
    31.    
    32.     INVOKE DialogBoxParam,HINST,ADDR DlgName,NULL,ADDR DlgProc,NULL
    33.     INVOKE ExitProcess,eax
    34.    
    35. DlgProc PROC hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    36.     .IF uMsg==WM_CLOSE
    37.         INVOKE SendMessage,hWnd,WM_COMMAND,IDC_EXIT,0
    38.     .ELSEIF uMsg==WM_COMMAND
    39.         mov eax,wParam
    40.         .IF ax==IDC_BTN1
    41.             INVOKE MessageBox,0,ADDR MessText,ADDR MessCap,MB_OK
    42.         .ENDIF
    43.     .ELSEIF uMsg==IDC_EXIT
    44.         INVOKE EndDialog,hWnd,NULL
    45.     .ELSEIF uMsg==DC_BTN2
    46.         INVOKE MessageBox,0,ADDR MessText2,ADDR MessCap,MB_OK
    47.         INVOKE SendMessage,hWnd,WM_COMMAND,IDC_EXIT,0
    48.     .ENDIF 
    49.     mov eax,FALSE
    50.     Ret
    51. DlgProc EndP
    52.        
    53. end start
    а вот код РЦ-файла:

    Код (Text):
    1. #define IDD_DLG1 1000
    2. #define IDC_BTN1 1001
    3. #define IDC_BTN2 1002
    4. IDD_DLG1 DIALOGEX 6,6,194,106
    5. CAPTION "Привет Мир!"
    6. FONT 8,"MS Sans Serif",0,0
    7. STYLE 0x00CB0804
    8. BEGIN
    9.   CONTROL "Тыщ!",IDC_BTN1,"Button",0x50010000,26,44,54,13
    10.   CONTROL "Нажми!",IDC_BTN2,"Button",0x50010000,120,44,54,13
    11. END
    чтобы откомпились запускаю со следующими параметрами:
    Код (Text):
    1. C:\masm32\bin\rc DLG_EXE.rc
    2. C:\masm32\bin\ml /c /coff DLG_EXE.asm
    3. C:\masm32\bin\Link /SUBSYSTEM:WINDOWS DLG_EXE.obj DLG_EXE.res
    И создаётся эксе-программа. Но она не работает... =(
    Что я делаю не так?
     
  2. splinter

    splinter New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    45
    нашёл вроде ошибки, теперь код выглядит так:

    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
    6.  
    7. include \masm32\include\windows.inc
    8. include \masm32\include\user32.inc
    9. include \masm32\include\kernel32.inc
    10.  
    11. includelib \masm32\lib\user32.lib
    12. includelib \masm32\lib\kernel32.lib
    13.  
    14. .data
    15. DlgName             db 'IDD_DLG1',0
    16. MessText            db 'Тыщ!',0
    17. MessCap         db 'Хеловорд :)',0
    18. MessText2       db 'Выходим нах!',0
    19. .data?
    20. HINST dd ?
    21. .const
    22. IDD_DLG1        equ 1000
    23. IDC_BTN1        equ 1001
    24. DC_BTN2         equ 1002
    25. IDC_EXIT        equ 3002
    26.  
    27. .code
    28. start:
    29.     INVOKE GetModuleHandle,NULL
    30.     mov HINST,eax
    31.    
    32.     INVOKE DialogBoxParam,HINST,ADDR DlgName,NULL,ADDR DlgProc,NULL
    33.     INVOKE ExitProcess,eax
    34.    
    35. DlgProc PROC hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    36.     .IF uMsg==WM_CLOSE
    37.         INVOKE SendMessage,hWnd,WM_COMMAND,IDC_EXIT,0
    38.     .ELSEIF uMsg==BN_CLICKED
    39.         mov eax,wParam
    40.         .IF ax==IDC_BTN1
    41.             INVOKE MessageBox,0,ADDR MessText,ADDR MessCap,MB_OK
    42.         .ELSEIF ax==DC_BTN2
    43.             INVOKE MessageBox,0,ADDR MessText2,ADDR MessCap,MB_OK
    44.             INVOKE SendMessage,hWnd,WM_COMMAND,IDC_EXIT,0
    45.         .ENDIF
    46.     .ELSEIF uMsg==IDC_EXIT
    47.         INVOKE EndDialog,hWnd,NULL
    48.     .ENDIF 
    49.     mov eax,FALSE
    50.     Ret
    51. DlgProc EndP
    52.        
    53. end start
    Но всеравно не работает(((
     
  3. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Что значит не работает? Крешится? Самоудаляется? Цвет окна не тот? И самый животрепещущий вопрос: что видно в отладчике? Какая-то из функций вернула ошибку?
     
  4. splinter

    splinter New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    45
    Не работает - значит не выводится окно даже =) В отладке я не силён. Выполнял код пошагово в ольке, но это меня в тупик загнало.

    INVOKE GetModuleHandle,NULL
    mov HINST,eax

    INVOKE DialogBoxParam,HINST,ADDR DlgName,NULL,ADDR DlgProc,NULL
    INVOKE ExitProcess,eax

    выолняет DialogBoxParam, а дальше идёт на ExitProcess сразу...
    Я с диалогами впервые работаю. Тут нет цикла сообщений и т.п.
    А когда выполняю пошагово, не попадаю на процедуру DlgProc

    Кому не трудно, посмотрите код. Думаю, гуру заметит ошибку невооружённым глазом. так как кода мало....
     
  5. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    И не будет!
     
  6. Noga

    Noga New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2008
    Сообщения:
    92
    Зачем ждать столько времени, если можно сравнить с проверенным Зелионом ? http://wasm.ru/article.php?article=1001010
     
  7. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Блин, ребята, вы куда редактирование постов дели??? Придется вдогонку писать вместо добавления :dntknw:

    Итак, комментарий к моему предыдущему посту:
    Функция DialogBoxParam 2-м параметром принимает (внимание!) или указатель на имя диалога, или целое число, указывающее на номер диалога в ресурсах.

    Ты задал идентификатор диалога (т.е. целое число) в ресурсах. Но пытаешься использовать указатель на его имя (которое ты вообще не задал). Либо надо править ресурсы и давать диалогу ИМЯ вместо целочисленного идентификатора, либо передавать в функцию целочисленный идентификатор диалога, вместо указателя на строку.
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    splinter
    собсно вот код простенькой программы:
    Код (Text):
    1. .686P
    2. .model flat
    3. includelib user32.lib
    4. include windows.inc
    5. extern _imp__DialogBoxParamA@20:dword
    6. extern _imp__SendMessageA@16:dword
    7. extern _imp__MessageBoxA@16:dword
    8. extern _imp__EndDialog@8:dword
    9. .const
    10. IDC_BUTTON      equ 0
    11. IDC_EXIT        equ 1
    12. .code
    13. start:  xchg ebx,eax
    14.     push ebx    ;0
    15.     push offset DlgProc
    16.     push ebx
    17.     push offset DlgName
    18.     push 400000h    ;hInstance
    19.     call _imp__DialogBoxParamA@20
    20.     ret
    21. DlgName db "MyDialog",0
    22. DlgProc proc hwnd:DWORD, Msg:DWORD, wParam:DWORD, lParam:DWORD
    23.         mov eax,Msg
    24.     mov esi,hwnd
    25.         sub eax,WM_CLOSE
    26.     je short @@WM_CLOSE
    27.         sub eax,WM_COMMAND-WM_CLOSE
    28.     jne short a1
    29. @@WM_COMMAND: movzx eax,word ptr wParam
    30.         jmp dword ptr menu_handlers[eax*4]
    31. @@WM_CLOSE: push ebx
    32.         push IDC_EXIT
    33.     push WM_COMMAND
    34.     push esi    ;hwnd
    35.     call _imp__SendMessageA@16
    36.         jmp short a1
    37. MBox:   push ebx    ;MB_OK
    38.         push offset MessCap
    39.     push offset MessText
    40.     push ebx
    41.     call _imp__MessageBoxA@16
    42.         jmp short a1
    43. EXIT:   push ebx    ;MB_OK
    44.         push offset MessCap
    45.     push offset MessText2
    46.     push ebx
    47.     call _imp__MessageBoxA@16
    48.     push ebx
    49.     push esi    ;hwnd
    50.     call _imp__EndDialog@8
    51. a1: xor eax,eax
    52.     ret 10h
    53. menu_handlers   dd MBox, EXIT
    54. MessText        db 'Тыщ!',0
    55. MessCap         db 'Хеловорд :)',0
    56. MessText2       db 'Выходим нах!',0
    57. DlgProc endp
    58. end start
    а вот код РЦ-файла:
    Код (Text):
    1. #include "resource.h"
    2.  
    3. #define IDC_BUTTON                                     0
    4. #define IDC_EXIT                                       1
    5.  
    6.  
    7. MyDialog DIALOGEX 6, 6, 194, 106
    8. STYLE 0xCB0804
    9. FONT 8,"MS Sans Serif",0,0
    10. CAPTION "Привет Мир!"
    11. BEGIN
    12. CONTROL "Тыщ!",IDC_BUTTON,"Button",0x50010000,26,44,54,13
    13. CONTROL "Нажми!",IDC_EXIT,"Button",0x50010000,120,44,54,13
    14. END
    чтобы откомпились запускаю со следующими параметрами:
    Код (Text):
    1. if exist %filename%.rc (
    2. %masm_path%\bin\rc /v %1.rc
    3. %masm_path%\bin\cvtres /machine:ix86 %1.res
    4. %masm_path%\bin\ml /c /Cp /Gz /I%masm_path%\include /coff /nologo %filename%.asm  || exit
    5. %masm_path%\bin\Link /SUBSYSTEM:WINDOWS /MERGE:.data=.text ^
    6. /LIBPATH:%masm_path%\lib /NOLOGO %filename%.obj %filename%.res || exit
    7. del %filename%.res
    8. ) else (
    9. %masm_path%\bin\ml /c /Cp /Gz /I%masm_path%\include /coff /nologo %filename%.asm  || exit
    10. %masm_path%\bin\Link /SUBSYSTEM:WINDOWS /MERGE:.data=.text ^
    11. /LIBPATH:%masm_path%\lib /NOLOGO %filename%.obj
    12. )
    В чем разница -- ищи сам. В аттаче сорц и ехе
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    splinter
    start: xchg ebx,eax <-- это характерно для Windows XP там при старте приложения eax=0
    для других Windows лучше поставте xor ebx,ebx
    [offtop] Что за хрень с редактированием?[/offtop]
     
  10. splinter

    splinter New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    45
    FatMoon, спасибо, мен! Остальным тоже спасибо!
    Используя ресурседит не уследил за самим ресурсом, так как пологался на него... А про способ с Идентификатором я и не знал =)