Не работают откомпилированные exe файлы.

Тема в разделе "WASM.BEGINNERS", создана пользователем k0rinf, 14 июл 2009.

  1. k0rinf

    k0rinf New Member

    Публикаций:
    0
    Регистрация:
    14 июл 2009
    Сообщения:
    5
    Я новечок в этом деле! вобщем вот пример (из книжки)

    Код (Text):
    1. ; --------------- File model
    2.             .386
    3.             .model  flat,stdcall
    4.             option  casemap:none
    5.  
    6. ; --------------- Includes
    7.             include C:\masm32\include\windows.inc
    8.             include C:\masm32\include\kernel32.inc
    9.             include C:\masm32\include\user32.inc
    10.             include C:\masm32\include\gdi32.inc
    11.  
    12. ; --------------- Libraries
    13.             includelib C:\masm32\lib\kernel32.lib
    14.             includelib C:\masm32\lib\user32.lib
    15.             includelib C:\masm32\lib\gdi32.lib
    16.  
    17. .data
    18. ClassName   BYTE    "SimpleWinClass",0
    19. AppName     BYTE    "Первое окно",0
    20. wc      WNDCLASSEX <>
    21. msg     MSG<>
    22. hwnd        HWND    ?
    23. hInst       HINSTANCE   ?
    24.  
    25. .code
    26. start:
    27.  
    28. invoke GetModuleHandle, NULL
    29. mov hInst, EAX ; Handle Programmi
    30.  
    31. ;///////////zapolnyayou structuru okna///////////////////////////////////////////////////////////////
    32. mov wc.cbSize, SIZEOF WNDCLASSEX ;Число байтов занимаемое структурой WNDCLASSEX
    33. mov wc.style, CS_HREDRAW or CS_VREDRAW  ;Стили окна
    34. mov wc.lpfnWndProc, OFFSET WndProc ;Адресс процедуры которая реагирую на сообщения окна
    35. mov wc.cbClsExtra,  NULL
    36. mov wc.cbWndExtra,  NULL
    37.  
    38. push hInst
    39. pop wc.hInstance
    40. mov wc.hbrBackground,   COLOR_WINDOWFRAME
    41. mov wc.lpszMenuName,    NULL
    42. mov wc.lpszClassName,   OFFSET ClassName
    43.  
    44. invoke LoadIcon,NULL, IDI_APPLICATION
    45. mov     wc.hIcon,   EAX
    46. mov wc.hIconSm, EAX
    47.  
    48. invoke LoadCursor,NULL, IDC_ARROW
    49. mov wc.hCursor, EAX
    50. ;///////////////////////////////////////////////////////////////////////////////////////////////////
    51. ;///////////Zapolnina/////////////////////////////////////////////////////////////////////////////
    52.  
    53. ;Если долго посмотреть то все понятно!!!)))))
    54. invoke RegisterClassEx, ADDR wc
    55.  
    56. INVOKE CreateWindowEx, NULL, ADDR ClassName, ADDR AppName,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL
    57.  
    58. mov hwnd,eax
    59. invoke ShowWindow, hwnd,SW_SHOWNORMAL
    60.  
    61. .WHILE  TRUE
    62.    
    63.     invoke  GetMessage, ADDR msg, NULL,0,0
    64.     or eax,eax
    65.     jz Quit
    66.     invoke  DispatchMessage, ADDR msg
    67.    
    68. .ENDW
    69.  
    70. Quit:
    71. mov eax,msg.wParam
    72. invoke  ExitProcess,    EAX
    73.  
    74. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    75.     .IF uMsg == WM_DESTROY
    76.         invoke PostQuitMessage,NULL
    77.     .ELSE
    78.         invoke DefWindowProc, hwnd,uMsg,wParam,lParam
    79.         ret
    80.     .ENDIF
    81.    
    82.  
    83. xor eax,eax
    84. ret
    85. WndProc endp
    86.  
    87. end start
    После чего компилирую с такими параметрами:
    ml /c /coff "1.asm"
    link /SUBSYSTEM:windows "1.obj"
    Создаеться файл 1.exe но после его включения он висит в процесах и никакого окна не создаеться! OllyDbg вроде показал что все нормально но окна нету!(( и еще сразу че за ДZен такой??? че это такое? а тот тут тока это и видно.
     
  2. h3rmit

    h3rmit New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    28
    CreateWindowEx возвращает ошибку INVALID_WINDOW_HANDLE в твоём примере. Копай в сторону неправильно заполненной структуры wc (мне так кажеццо почемуто). Счас нет времени проверять - убегаю.
     
  3. k0rinf

    k0rinf New Member

    Публикаций:
    0
    Регистрация:
    14 июл 2009
    Сообщения:
    5
    Да спасибо заметил! ща буду копать!
     
  4. k0rinf

    k0rinf New Member

    Публикаций:
    0
    Регистрация:
    14 июл 2009
    Сообщения:
    5
    чето немогу найти в чем ошибка помогайте плизз
     
  5. k0rinf

    k0rinf New Member

    Публикаций:
    0
    Регистрация:
    14 июл 2009
    Сообщения:
    5
    ПИПЕЦ ПРОСТО! Нашел оригинальный исходник CTRL+C CTRL+V скомпилирывал работает! ОФИГЕЛ ПЕРВЫЙ РАЗ.
    Посмотрел вроде все также за исключением переменой одной у меня hInst а там hInstance. (Задумался) Фиг с ним думаю переделал. Компилирую всеравно все также! окна нету в процессах висит. (Задумаля второй раз). Открыл OllyDbg смотрю функция CreateWindowEx в рабочем примере ERROR_SUCCESS в моем ERROR_INVALID_WINDOW_HANDLE. Начинаю сравнивать данные OllyDbg
    Код (Text):
    1. 00401002  |. E8 6F010000    CALL <JMP.&kernel32.GetModuleHandleA>    ; \GetModuleHandleA
    2. 00401002  |. E8 3B010000    CALL <JMP.&kernel32.GetModuleHandleA>    ; \GetModuleHandleA
    3.  
    4. 0040106F  |. E8 E4000000    CALL <JMP.&user32.LoadIconA>             ; \LoadIconA
    5. 0040106F  |. E8 F2000000    CALL <JMP.&user32.LoadIconA>             ; \LoadIconA
    6.  
    7. 00401094  |. E8 CB000000    CALL <JMP.&user32.RegisterClassExA>      ; \RegisterClassExA
    8. 00401094  |. E8 D9000000    CALL <JMP.&user32.RegisterClassExA>      ; \RegisterClassExA
    9.  
    10. 0040109B  |. FF35 6B304000  PUSH DWORD PTR DS:[40306B]               ; |hInst = NULL
    11. 0040109B  |. FF35 6B304000  PUSH DWORD PTR DS:[40306B]               ; |hInst = 00400000
    12.  
    13. 004010CA  |. E8 6B000000    CALL <JMP.&user32.CreateWindowExA>       ; \CreateWindowExA
    14. 004010CA  |. E8 79000000    CALL <JMP.&user32.CreateWindowExA>       ; \CreateWindowExA
    15.  
    16. и т.д. Если нужно предоставлю все.
    На скока я понимаю E8 6F010000 это машинный код команды Invoke GetModuleHandle, NULL но в моей версии он E8 3B010000. Остальное все идентично равно! не равны тока машинные команды(если я правельно понял что обозначают эти числа) (Задумался вобще в край)
    (знаю бред) стал доводить код двух прогг до идентичного сходства
    Код (Text):
    1. Рабочая версия
    2. ;А.Крупник "Самоучитель: Ассемблер"
    3. ;Листинг 13.4. Первая "оконная" программа
    4. ;Компиляция
    5. ;           wmake l134
    6. .386
    7. .model flat,stdcall
    8. option casemap:none
    9. include C:\masm32\include\windows.inc
    10. include C:\masm32\include\user32.inc
    11. include C:\masm32\include\kernel32.inc
    12. includelib C:\masm32\lib\user32.lib
    13. includelib C:\masm32\lib\kernel32.lib
    14. .data
    15. ClassName BYTE "SimpleWinClass",0
    16. AppName   BYTE "Первое окно",0
    17. wc        WNDCLASSEX <>
    18. msg       MSG <>
    19. hwnd      HWND ?
    20. hInstance HINSTANCE ?
    21. .code
    22. start:
    23. invoke  GetModuleHandle, NULL
    24. mov     hInstance,eax       ;запомнить дескриптор программы
    25. mov     wc.cbSize,SIZEOF WNDCLASSEX
    26. mov     wc.style, CS_HREDRAW or CS_VREDRAW
    27. mov     wc.lpfnWndProc, OFFSET WndProc
    28. mov     wc.cbClsExtra,NULL
    29. mov     wc.cbWndExtra,NULL
    30. push        hInstance
    31. pop     wc.hInstance
    32. mov     wc.hbrBackground, COLOR_WINDOWFRAME
    33. mov     wc.lpszMenuName,NULL
    34. mov     wc.lpszClassName,OFFSET ClassName
    35. invoke  LoadIcon,NULL,IDI_APPLICATION
    36. mov     wc.hIcon,eax
    37. mov     wc.hIconSm,eax
    38. invoke  LoadCursor,NULL,IDC_ARROW
    39. mov     wc.hCursor,eax
    40. invoke  RegisterClassEx, ADDR wc
    41. INVOKE  CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
    42.         WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
    43.         CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,\
    44.         NULL,NULL,hInstance,NULL
    45. mov     hwnd,eax
    46. invoke  ShowWindow, hwnd,SW_SHOWNORMAL
    47. .WHILE  TRUE
    48. invoke  GetMessage, ADDR msg, NULL, 0, 0
    49. or      eax,eax
    50. jz  Quit
    51. invoke  DispatchMessage, ADDR msg
    52. .ENDW
    53. Quit:
    54. mov     eax,msg.wParam
    55. invoke  ExitProcess,eax
    56. WndProc proc hWnd:HWND, uMsg:UINT,\
    57.         wParam:WPARAM, lParam:LPARAM
    58. .IF uMsg==WM_DESTROY
    59.    invoke PostQuitMessage,NULL
    60. .ELSE
    61.    invoke DefWindowProc, hWnd, uMsg, wParam, lParam
    62.     ret
    63. .ENDIF
    64. xor     eax, eax
    65. ret
    66. WndProc endp
    67. end start
    моя версия
    Код (Text):
    1. .386
    2. .model  flat,stdcall
    3. option  casemap:none
    4. include C:\masm32\include\windows.inc
    5. include C:\masm32\include\kernel32.inc
    6. include C:\masm32\include\user32.inc
    7. includelib C:\masm32\lib\kernel32.lib
    8. includelib C:\masm32\lib\user32.lib
    9. .data
    10. ClassName   BYTE    "SimpleWinClass",0
    11. AppName     BYTE    "Первое окно",0
    12. wc      WNDCLASSEX <>
    13. msg     MSG <>
    14. hwnd        HWND    ?
    15. hInstance   HINSTANCE ?
    16. .code
    17. start:
    18. invoke GetModuleHandle, NULL
    19. mov hInstance, eax
    20. mov wc.cbSize, SIZEOF WNDCLASSEX
    21. mov wc.style, CS_HREDRAW or CS_VREDRAW
    22. mov wc.lpfnWndProc, OFFSET WndProc
    23. mov wc.cbClsExtra,  NULL
    24. mov wc.cbWndExtra,  NULL
    25. push        hInstance
    26. pop wc.hInstance
    27. mov wc.hbrBackground, COLOR_WINDOWFRAME
    28. mov wc.lpszMenuName,NULL
    29. mov wc.lpszClassName,OFFSET ClassName
    30. invoke  LoadIcon,NULL,IDI_APPLICATION
    31. mov     wc.hIcon,eax
    32. mov wc.hIconSm,eax
    33. invoke  LoadCursor,NULL,IDC_ARROW
    34. mov wc.hCursor,eax
    35. invoke  RegisterClassEx, ADDR wc
    36. INVOKE  CreateWindowEx, NULL, ADDR ClassName, ADDR AppName,\
    37.     WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,\
    38.     CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,\
    39.     NULL,NULL,hInstance,NULL
    40. mov hwnd,eax
    41. invoke ShowWindow, hwnd,SW_SHOWNORMAL
    42. .WHILE  TRUE
    43. invoke  GetMessage, ADDR msg, NULL,0,0
    44. or eax,eax
    45. jz Quit
    46. invoke  DispatchMessage, ADDR msg
    47. .ENDW
    48. Quit:
    49. mov eax,msg.wParam
    50. invoke  ExitProcess, eax
    51. WndProc proc hWnd:HWND, uMsg:UINT,\
    52.      wParam:WPARAM, lParam:LPARAM
    53. .IF uMsg == WM_DESTROY
    54.    invoke PostQuitMessage,NULL
    55. .ELSE
    56.    invoke DefWindowProc, hwnd,uMsg,wParam,lParam
    57.     ret
    58. .ENDIF 
    59. xor     eax,eax
    60. ret
    61. WndProc endp
    62. end start
    еще раз все проверил! ВСЕ ТОЧНО ТАКЖЕ! Понял что мои знания равны 0. Ударил (Сильно) комп(не помогло) и пришел на форум!) ПОМОГИТЕ ПЛИИЗЗ где тут косяк???
     
  6. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    В твоей версии замени invoke DefWindowProc, hwnd,uMsg,wParam,lParam на
    invoke DefWindowProc, hWnd,uMsg,wParam,lParam

    Кстати это один из примеров показывающих, почему глобальные переменные это зло %)
     
  7. h3rmit

    h3rmit New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    28
    нда, об этом кстати ошибка CreateWindowEx и говорила.

    2TSS
    А я тоже этого не понимал %) теперь понял ...
     
  8. k0rinf

    k0rinf New Member

    Публикаций:
    0
    Регистрация:
    14 июл 2009
    Сообщения:
    5
    Спасибо!!! помогло!!! Работает!! Теперья тоже понял что это зло!