1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Помогите с win api

Тема в разделе "WASM.BEGINNERS", создана пользователем Loginanton, 8 май 2008.

  1. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Loginanton
    masm прекрасно это компилит. Вот только линкер не может найти _MessageBox@16
    Замени в двух местах на MessageBoxA и будет тебе счастье.
     
  2. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    valterg о спасиб :) тока почему то он ошибку выдаёт при запуске скомпилированной проги :dntknw: Это только у меня?
     
  3. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.825
    Loginanton
    сразу пиши конкретно какие
     
  4. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    Короче я понял: надо данные запихнуть в .data :D А вот почему без этого выдаёт ошибку для меня тайна
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.709
    Loginanton
    почему то он ошибку выдаёт при запуске скомпилированной проги ... надо данные запихнуть в .data
    Запусти в отладчике, например, olly, и посмотри на код, который получает управление, когда $Title и $Text в секци .code и когда они в секции .data.
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Loginanton
    Потому что у тебя указана точка входа start и за ней идут данные. Нужно было либо jmp поставить, либо задать вход там, где команды, либо данные поставить после call ExitProcess
     
  7. masm32

    masm32 New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2008
    Сообщения:
    147
  8. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    DEEP, если у тебя будет время пожалуйста расскажи поподробнее о функции CreateWindowEx. И приведи пример проги, где использовалась бы только эта функция и ExitProcess. А то я запутался в коде третей части :)
     
  9. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Она создает окно с расширенными атрибутами. Без демонстрации свойств этих атрибутов она эквивалентна CreateWindow - стало быть пример, который ты хочешь, не имеет смысла.
     
  10. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    подскажите что это обозначает:
    Код (Text):
    1. WinMain PROC
    2. ; тут код всякий (смайл)
    3. WinMain ENDP
     
  11. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    Вот есть пример:
    Код (Text):
    1. WNDCLASS STRUCT
    2.   style             DWORD      ?
    3.   lpfnWndProc       DWORD      ?
    4.   cbClsExtra        DWORD      ?
    5.   cbWndExtra        DWORD      ?
    6.   hInstance         DWORD      ?
    7.   hIcon             DWORD      ?
    8.   hCursor           DWORD      ?
    9.   hbrBackground     DWORD      ?
    10.   lpszMenuName      DWORD      ?
    11.   lpszClassName     DWORD      ?
    12. WNDCLASS ENDS
    13.  
    14. .data
    15. wc WNDCLASS <>
    Можно ли этот кусок кода записать как нибудь по другому?
     
  12. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Можно, смотри здесь
     
  13. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    DEEP
    Код (Text):
    1. format PE GUI
    2. include 'win32ax.inc'
    3. ; import data in the same section
    4.       xor ebx,ebx
    5.       mov edi,wTitle
    6.       mov esi,400000h
    7.       ; +------------------------------+
    8.       ; | registering the window class |
    9.       ; +------------------------------+
    10.       invoke RegisterClass,esp,ebx,window_procedure,ebx,\
    11.       ebx,esi,ebx,10011h,COLOR_WINDOW+1,ebx,edi
    12.       ; +--------------------------+
    13.       ; | creating the main window |
    14.       ; +--------------------------+
    15.       push ebx
    16.       push esi
    17.       shl esi,9
    18.       invoke CreateWindowEx,ebx,edi,edi,WS_OVERLAPPEDWINDOW+WS_VISIBLE,\
    19.       esi,esi,esi,esi,ebx,ebx
    20.       mov ebp,esp
    21.       ; +---------------------------+
    22.       ; | entering the message loop |
    23.       ; +---------------------------+
    24. message_loop: invoke GetMessage,ebp,ebx,ebx,ebx
    25.       invoke DispatchMessage,ebp
    26.       jmp message_loop
    27.       ; +----------------------+
    28.       ; | the window procedure |
    29.       ; +----------------------+
    30. window_procedure: cmp dword[esp+0x08],WM_DESTROY
    31.            je wmDESTROY
    32.            jmp dword [DefWindowProc]
    33. wmDESTROY: invoke ExitProcess,ebx
    34.  
    35.       wTitle db   'Iczelion Tutorial #3:A Simple Window in FASM',0 ;name of our window
    36. data import
    37.  
    38.  library KERNEL32, 'KERNEL32.DLL',\
    39.      user32,   'USER32.DLL'
    40.  import KERNEL32,\
    41.            ExitProcess,    'ExitProcess'
    42.  import user32,\
    43.         RegisterClass,      'RegisterClassA',\
    44.         CreateWindowEx,     'CreateWindowExA',\
    45.         DefWindowProc,      'DefWindowProcA',\
    46.         GetMessage,     'GetMessageA',\
    47.         DispatchMessage,    'DispatchMessageA'
    48. end data
     
  14. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    :-)

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

    Чтобы потом не спешить называть написанное статьей, а сначала самому критически изучить собственный текст.

    Но, кажется, этот важнейший этап вами пропущен. Куча ошибок.

    Конечно, у Iczelion-а тоже есть ошибки, но вы все-таки пишете после него :-)
    (Впрочем, допускаю, что крутой педагог Iczelion просто по-хитрому стимулировал изучающих, ну, типа как инструктор на занятиях: "Внимание, ввожу неисправность" :-) )

    Пожалуйста, вот темы для разбора (бегло, что бросается в глаза):
    - WNDCLASS/WNDCLASSEX, RegisterClass/RegisterClassEx (не различаете),
    - db/equ (что тут изменяется/не изменяется, а?),
    - "CS_HREDRAW – Окно в случае перемещения/изменения размера по горизонтали должно перерисоваться" (window/client area),
    - "WS_EX_MDICHILD: необходим для создания MDI-приложений (окно полностью находится в окне-"предке"),
    - "WS_CLIPSIBLINGS: из области перерисовки исключаются все окна того же класса"
    - "WS_MAXIMIZEBOX: в заголовок добавляется []. Употребимо только с WS_SYSMENU" (с чего вы взяли?)

    P.S. А не замахнуться ли на WinAPI+GUI в комиксе? (почти не шучу)
     
  15. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    Mikl__ А можешь выложить кусок кода как подругому записывать, а то у меня почему то все архивы в той ветви битые :dntknw:
     
  16. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    492
    Адрес:
    г. Владимир
    > kero

    Ну вот, первый кирпич на голову :)
    Эх, зря выкладывал... А всё что находится в моей недостатье, получено мною без уроков Iczelion'a (и кого-л. другого), чисто на основании опыта. Когда-то давно, я два дня потратил на создание чёртовой тучи окон с разными парамами и записывал их действие на внешний вид етих окон. Видимо, то ли не все варианты перебрал, то ли от усталости глаз замылился :dntknw:

    В общем, чукча более не писатель...
    второй кирпич. Вот блин, поспешил я что называется явить миру свою "мудрость"...
     
  17. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    DEEP
    Ну почему же? Совместно придти к наиболее полной и корректной версии статей - это же гораздо полезнее, чем написать еще один цикл статей с авторским видением проблемы.

    В RadASM удобно проводить подобные махинации в редакторе ресурсов (набор checkbox'ов для смены флагов битовых полей стилей). В свое время весьма интересно провел час-другой, перебирая варианты.
     
  18. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.943
    и в ViSG - е это реализовано суперски (http://wasm.ru/forum/viewtopic.php?id=19989&p=3).
     
  19. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.943
  20. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    Код проги:
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap: none
    4.  
    5. ;==========
    6.  
    7. includelib masm32\lib\kernel32.lib
    8. includelib masm32\lib\user32.lib
    9. includelib masm32\lib\gdi32.lib
    10.  
    11. ;==========
    12.  
    13. GetModuleHandleA proto :dword
    14. LoadIcon proto :dword
    15. LoadCursor proto :dword
    16. RegisterClassEx proto :dword
    17. ExitProcess proto :dword
    18.  
    19. ;==========
    20.  
    21. .data
    22.  
    23. ClassName db "LOL",0
    24.  
    25. .data?
    26.  
    27. Handle dword ? ; тут будет хранится хендл проги
    28.  
    29. ForClass struct dword ; тут будет будет хранится инфа для создания класса
    30.  
    31. cbSize dword ?
    32. style dword ?
    33. IpfnWndProc dword ?
    34. cbClsExtra dword ?
    35. hInstance dword ?
    36. hIcon dword ?
    37. hCursor dword ?
    38. nbrBackground dword ?
    39. IpszMenuName dword ?
    40. IpszClassName dword ?
    41. hIconSm dword ?
    42.  
    43. ForClass ends
    44.  
    45. .code
    46.  
    47. ;==========
    48.  
    49. start:
    50.  
    51. push 0
    52. call GetModuleHandleA
    53. mov Handle, eax
    54.  
    55. mov ForClass.cbSize, sizeof dword
    56. mov ForClass.style, cs_hredraw or cs_vredraw
    57. mov ForClass.IpfnWndProc, offset WndProc
    58. mov ForClass.cbClsExtra, 0
    59. mov ForClass.cbWndExtra, 0
    60. push Handle
    61. pop ForClass.hInstance
    62. mov ForClass.hbrBackground, 0
    63. mov ForClass.IpszMenuName, 0
    64. mov ForClass.IpszClassName, offset ClassName
    65.  
    66. push 0
    67. call LoadIcon
    68. mov ForClass.hIcon, eax
    69. mov ForClass.hIconSm, eax
    70.  
    71. push 0
    72. call LoadCursor
    73. mov ForClass.hCursor, eax
    74.  
    75. push ForClass
    76. call RegisterClassEx
    77.  
    78. push 0
    79. call ExitProcess
    80.  
    81. end start
    Помогите пожалуйста найти ошибки