Уроки Iczelion'а от Sulaiman Chang на диалекте FASM

Тема в разделе "FASM", создана пользователем Mikl___, 12 дек 2016.

  1. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709

    Win32 API. Урок 17. Динамические библиотеки

    Текст tut_17a
    Код (ASM):
    1. format PE GUI 4.0 DLL
    2. entry DllMain
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.         DllErrBoxTitle  db 'DllMsgBox - Error',0
    8.  
    9. section '.code' code readable executable
    10.         proc    DllMain, hinstDll, fdwReason, lpvReserved
    11.                 mov  eax,TRUE
    12.                 return
    13.         endp
    14.      
    15.         proc    DllErrBox, hWnd, errMsg
    16.                 invoke  MessageBox,[hWnd],[errMsg],DllErrBoxTitle,MB_OK + MB_ICONERROR
    17.                 return
    18.         endp
    19.  
    20. section '.idata' import data readable
    21.         library USER32, 'USER32.DLL'
    22.  
    23.         import  USER32,\
    24.                 MessageBox,     'MessageBoxA'
    25.  
    26. section '.edata' export data readable
    27.         export  'TUT_17.DLL',\
    28.                 DllErrBox,      'DllErrBox'
    29.  
    30. section '.reloc' fixups data discardable
    Текст tut_17b.asm
    Код (ASM):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.         msg1    db '[code]',13,10
    8.                 db '      Invoke DllErrBox,HWND_DESKTOP,msg1',13,10,13,10
    9.                 db '      import TUT_17A,\',13,10
    10.                 db '      DllErrBox,   ''DllErrBox''',13,10
    11.                 db '[/codе]',0
    12.  
    13. section '.code' code readable executable
    14.         start:
    15.                 invoke  DllErrBox,HWND_DESKTOP,msg1
    16.                 invoke  ExitProcess,0
    17.  
    18. section '.idata' import data readable
    19.         library KERNEL32,'KERNEL32.DLL',\
    20.                 TUT_17A, 'TUT_17A.DLL'
    21.      
    22.         import  KERNEL32,\
    23.                 ExitProcess,    'ExitProcess'
    24.      
    25.         import  TUT_17A,\
    26.                 DllErrBox,      'DllErrBox'
    Текст tut_17c.asm
    Код (ASM):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.         dllName         db 'TUT_17A.DLL',0              ;dll name that to be loaded
    8.         funcName        db 'DllErrBox',0                ;function / proc name that wish to be called
    9.         funcAddr        dd ?                            ;store function address
    10.      
    11.         msgBoxTitle     db 'Error',0
    12.         msgBoxDll       db 'The Requested DLL not found!',0
    13.         msgBoxProc      db 'The Requested Procedure not found!',0
    14.      
    15.         msg1            db '[code]',13,10
    16.                         db '      invoke  LoadLibrary,dllName',13,10
    17.                         db '      invoke  GetProcAddress,eax,funcName',13,10
    18.                         db '      invoke  funcAddr,HWND_DESKTOP,msg1',13,10
    19.                         db '[/codе]',0
    20.  
    21. section '.code' code readable executable
    22.         start:
    23.                 invoke  LoadLibrary,dllName
    24.                         cmp  eax,NULL                   ;the dll not found
    25.                         je   dll_not_found
    26.                 invoke  GetProcAddress,eax,funcName
    27.                         cmp  eax,NULL                   ;requested function not found
    28.                         je   proc_not_found
    29.                         mov  [funcAddr],eax
    30.                 invoke  funcAddr,HWND_DESKTOP,msg1
    31.                         jmp  exit
    32.              
    33.                 dll_not_found:
    34.                         invoke  MessageBox,HWND_DESKTOP,msgBoxDll,msgBoxTitle,MB_OK + MB_ICONERROR
    35.                                 jmp  exit
    36.                 proc_not_found:
    37.                         invoke  MessageBox,HWND_DESKTOP,msgBoxProc,msgBoxTitle,MB_OK + MB_ICONERROR
    38.                                 jmp  exit
    39.         exit:
    40.                         invoke  ExitProcess,0
    41.  
    42. section '.idata' import data readable
    43.         library KERNEL32,'KERNEL32.DLL',\
    44.                 USER32,  'USER32.DLL'
    45.      
    46.         import  KERNEL32,\
    47.                 GetProcAddress, 'GetProcAddress',\
    48.                 LoadLibrary,    'LoadLibraryA',\
    49.                 ExitProcess,    'ExitProcess'
    50.  
    51.         import  USER32,\
    52.                 MessageBox,     'MessageBoxA'
    Результат
    [​IMG]
    tut_17b.asm​
    [​IMG]

    tut_17c.asm​
     

    Вложения:

    • tut_17b.gif
      tut_17b.gif
      Размер файла:
      3 КБ
      Просмотров:
      2.956
    • tut_17c.gif
      tut_17c.gif
      Размер файла:
      3,1 КБ
      Просмотров:
      2.933
    rococo795 нравится это.
  2. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709

    Win32 API. Урок 18. Простые управляющие элементы

    исходный текст и ехе-файл здесь
    Код (ASM):
    1. format PE GUI
    2. include 'win32ax.inc'
    3.  pb1             equ 1
    4.  sb1             equ 2
    5.  tm1             equ 3
    6.  btn1            equ 4
    7.  PBS_SMOOTH      equ 1
    8.  PBS_VERTICAL    equ 4
    9.    start:       xor ebx,ebx
    10.                 mov edi,wTitle
    11.                 mov esi,400000h
    12.                 ; +------------------------------+
    13.                 ; | registering the window class |
    14.                 ; +------------------------------+
    15.                 invoke RegisterClass,esp,ebx,window_procedure,ebx,\
    16.                        ebx,esi,ebx,10005h,COLOR_BTNFACE+1,ebx,edi
    17.                        push ebx
    18.                        push esi
    19.                        shl esi,9
    20.                 invoke CreateWindowEx,ebx,edi,edi,\
    21.                        WS_OVERLAPPEDWINDOW+WS_VISIBLE- WS_MAXIMIZEBOX - WS_SIZEBOX,\
    22.                        esi,esi,394,240,ebx,ebx
    23.                        pop esi
    24.                        mov  edi,eax
    25.                 invoke CreateWindowEx,WS_EX_DLGMODALFRAME,progressclass,ebx,WS_CHILD + WS_VISIBLE,\
    26.                        10,10,367,22,eax,pb1,esi,ebx
    27.                        mov  [pb1H],eax
    28.                 invoke SendMessage,eax,PBM_SETSTEP,2,ebx
    29.                 invoke CreateWindowEx,WS_EX_CLIENTEDGE+WS_EX_STATICEDGE,progressclass,ebx,WS_CHILD + WS_VISIBLE + PBS_SMOOTH,\
    30.                        10,40,367,22,edi,pb1,esi,ebx
    31.                        mov  [pb2H],eax
    32.                 invoke SendMessage,eax,PBM_SETSTEP,2,ebx
    33.                 invoke CreateWindowEx,ebx,progressclass,ebx,WS_CHILD + WS_VISIBLE + PBS_VERTICAL,\
    34.                        305,80,25,100,edi,pb1,esi,ebx
    35.                        mov  [pb3H],eax
    36.                 invoke SendMessage,eax,PBM_SETSTEP,2,ebx
    37.                 invoke CreateWindowEx,ebx,progressclass,ebx,WS_CHILD + WS_VISIBLE + PBS_SMOOTH + PBS_VERTICAL,\
    38.                        350,80,25,100,edi,pb1,esi,ebx
    39.                        mov  [pb4H],eax
    40.                 invoke SendMessage,eax,PBM_SETSTEP,2,ebx
    41.                 invoke CreateStatusWindow,WS_CHILD + WS_VISIBLE,ebx,edi,sb1
    42.                        mov  [sb1H],eax
    43.                 invoke CreateWindowEx,ebx,"BUTTON","Click To Start",\
    44.                        WS_CHILD + WS_VISIBLE + BS_PUSHBUTTON,\
    45.                        10,90,100,30,edi,btn1,esi,ebx
    46.                        mov  [btn1H],eax
    47.                 invoke CreateSolidBrush,0FF0000h
    48.                        mov [blueBrush],eax
    49.                        mov ebp,esp
    50.                 ;+---------------------------+
    51.                 ;| entering the message loop |
    52.                 ;+---------------------------+
    53. window_message_loop_start: invoke  GetMessage,ebp,ebx,ebx,ebx
    54.                        invoke  DispatchMessage,ebp
    55.                        jmp window_message_loop_start
    56.    ;+----------------------+
    57.    ;| the window procedure |
    58.    ;+----------------------+
    59. proc window_procedure hWnd, uMsg, wParam, lParam
    60. local ps:PAINTSTRUCT
    61. local buffer[20]:BYTE
    62. local oldBrush:DWORD
    63.                 xor ebx,ebx
    64.                 mov eax,[uMsg]
    65.                 mov edi,[hWnd]
    66.                 dec eax;cmp [uMsg],WM_DESTROY=2
    67.                 dec eax
    68.                 je  .wmDESTROY
    69.                 sub eax,WM_PAINT-WM_DESTROY;cmp [uMsg],WM_PAINT=0Fh
    70.                 je  .wmPAINT
    71.                 sub eax,WM_COMMAND-WM_PAINT;cmp [uMsg],WM_COMMAND=111h
    72.                 je  .wmCOMMAND
    73.                 dec eax;cmp [uMsg],WM_TIMER=113h
    74.                 dec eax
    75.                 je  .wmTIMER
    76. .wmDefault:     leave
    77.                 jmp [DefWindowProc]
    78. .wmDESTROY:     invoke ExitProcess,ebx
    79. .wmPAINT:       invoke BeginPaint,edi,esp
    80.                 invoke SelectObject,dword[ps],[blueBrush]
    81.                 mov [oldBrush],eax
    82.                 finit
    83.                 fld [angle]
    84.                 fsincos
    85.                 push 80.0
    86.                 push 80.0
    87.                 fmul dword[esp]
    88.                 fistp dword[esp]
    89.                 fmul dword[esp+4]
    90.                 fchs
    91.                 fist dword[esp+4]
    92.                 add dword[esp+4],130
    93.                 add dword[esp],190
    94.                 invoke Pie,dword[ps],110,80,270,180,190,80
    95.                 invoke SelectObject,dword[ps],[oldBrush]
    96.                 invoke EndPaint,edi,esp
    97.                 jmp .wmBYE
    98. .wmCOMMAND:     cmp [wParam],BN_CLICKED shl 16 or 4
    99.                 jne .wmBYE
    100. .wmCOMMAND_btn1: invoke SetTimer,edi,tm1,100,ebx
    101.                 invoke EnableWindow,[btn1H],ebx
    102.                 jmp .wmBYE
    103. .wmTIMER:       lea esi,[SendMessage]
    104.                 mov edi,3
    105. @@:             push ebx ebx PBM_STEPIT [pb1H+edi*4]
    106.                 call dword[esi];invoke SendMessage,[pb1H],PBM_STEPIT,ebx,ebx
    107.                 push ebx ebx PBM_GETPOS [pb1H+edi*4]
    108.                 call dword[esi];invoke SendMessage,[pb1H],PBM_GETPOS,ebx,ebx
    109.                 dec edi
    110.                 jns @b
    111.                 lea edi,[buffer]
    112.                 cinvoke wsprintf,edi,template,eax
    113.                 push edi ebx SB_SETTEXT [sb1H]
    114.                 call dword[esi];invoke SendMessage,[sb1H],SB_SETTEXT,ebx,ebp
    115.                 invoke InvalidateRect,[hWnd],ebx,ebx
    116.                 finit
    117.                 fld [delta]
    118.                 fadd [angle]
    119.                 fst [angle]
    120.                 sub [pb1StepCurrent],2
    121.                 jne .wmBYE
    122.                 invoke  KillTimer,[hWnd],tm1
    123.                 push aText1 edi SB_SETTEXT [sb1H]
    124.                 call dword[esi];invoke SendMessage,[sb1H],SB_SETTEXT,ebx," 100% Completed"
    125.                 invoke MessageBox,[hWnd],aText2,aCaption,MB_OK + MB_ICONWARNING
    126. .wmBYE:         ret
    127. endp          
    128. ;------------------------------------------------------------
    129. template db " Process : %i %%",0
    130. aCaption db 'Virus Detected - Norton Antivirus',0
    131. aText1  db ' 100% Completed',0
    132. aText2  db      'Norton Antivirus detected "tut_18.exe" contained virus.',13,10
    133.                 db 'Please remove this application!',0
    134. wTitle          db 'Iczelion Tutorial #18: Common Controls',0
    135.         pb1H            rd 1
    136.         pb2H            rd 1
    137.         pb3H            rd 1
    138.         pb4H            rd 1
    139.         pb1StepCurrent  dd 100                    ;current step value
    140.         sb1H            rd 1
    141.         btn1H           rd 1
    142.         angle           dd 1.5795229730548682671159401454822;90.5*pi/180
    143.         delta           dd 0.12548917321839229658081336625433;7.19*pi/180
    144.         progressclass   db 'msctls_progress32',0
    145.         blueBrush       rd 1
    146. ;-------------------------------------------------------------
    147. data import
    148.     library     KERNEL32, 'KERNEL32.DLL',\
    149.                 USER32,   'USER32.DLL',\
    150.                 gdi32,    'gdi32.dll',\
    151.                 COMCTL32, 'COMCTL32.DLL'
    152.     import      KERNEL32,\
    153.                 ExitProcess,            'ExitProcess'
    154.     import      gdi32,\
    155.                 Pie,                            'Pie',\
    156.                 SelectObject,           'SelectObject',\
    157.                 CreateSolidBrush,       'CreateSolidBrush'
    158.     import      USER32,\
    159.                 RegisterClass,          'RegisterClassA',\
    160.                 CreateWindowEx,         'CreateWindowExA',\
    161.                 DefWindowProc,          'DefWindowProcA',\
    162.                 SendMessage,            'SendMessageA',\
    163.                 GetMessage,                     'GetMessageA',\
    164.                 SetTimer,                       'SetTimer',\
    165.                 KillTimer,                      'KillTimer',\
    166.                 wsprintf,                       'wsprintfA',\
    167.                 MessageBox,                     'MessageBoxA',\
    168.                 EnableWindow,           'EnableWindow',\
    169.                 DestroyWindow,          'DestroyWindow',\
    170.                 DispatchMessage,        'DispatchMessageA',\
    171.                 BeginPaint,                     'BeginPaint',\
    172.                 EndPaint,                       'EndPaint',\
    173.                 InvalidateRect,         'InvalidateRect',\
    174.                 PostQuitMessage,        'PostQuitMessage'
    175.     import      COMCTL32,\
    176.                 CreateStatusWindow,     'CreateStatusWindow'
    177. end data
    Результат
    [​IMG]
     

    Вложения:

    • 18.png
      18.png
      Размер файла:
      68,1 КБ
      Просмотров:
      2.976
    • tut_18.zip
      Размер файла:
      3,3 КБ
      Просмотров:
      984
    Последнее редактирование: 17 дек 2016
    rococo795 нравится это.
  3. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709

    Win32 API. Урок 19. Tree View Control

    исходный текст и ехе-файл здесь
    Код (ASM):
    1. format PE GUI
    2. include 'win32ax.inc'
    3. ;------------------------------------------------
    4.    start:       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,10005h,COLOR_BTNFACE+1,ebx,edi
    12.                 ; +--------------------------+
    13.                 ; | creating the main window |
    14.                 ; +--------------------------+
    15.                 push ebx esi ebx ebx 400 200
    16.                 shl esi,9
    17.                 invoke CreateWindowEx,WS_EX_CLIENTEDGE,edi,edi,WS_OVERLAPPEDWINDOW+WS_VISIBLE,\
    18.                 esi,esi
    19.                 mov ebp,esp
    20.    ;+---------------------------+
    21.    ;| entering the message loop |
    22.    ;+---------------------------+
    23.    @@:          invoke  GetMessage,ebp,ebx,ebx,ebx
    24.                 invoke  DispatchMessage,ebp
    25.                 jmp  @r
    26.    ;+----------------------+
    27.    ;| the window procedure |
    28.    ;+----------------------+
    29. proc window_procedure hWnd, uMsg, wParam, lParam
    30.                 mov esi,[tv1H]
    31.                 cmp  [uMsg],WM_CREATE
    32.                 je   wmCREATE
    33.                 cmp  [uMsg],WM_DESTROY
    34.                 je   wmDESTROY
    35.                 cmp  [uMsg],WM_NOTIFY
    36.                 je   wmNOTIFY
    37.                 cmp  [uMsg],WM_MOUSEMOVE
    38.                 je   wmMOUSEMOVE
    39.                 cmp  [uMsg],WM_LBUTTONUP
    40.                 je   wmLBUTTONUP
    41. wmDEFAULT:     leave
    42.                 jmp [DefWindowProc]
    43. wmMOUSEMOVE:   cmp  [imgl1Drag],0
    44.                 je  wmDEFAULT
    45.                 movzx eax,word[lParam]
    46.                 movzx ecx,word[lParam+2]
    47.                 lea edi,[tv1HitInfo]
    48.                 mov  [edi+TV_HITTESTINFO.pt.x],eax
    49.                 mov  [edi+TV_HITTESTINFO.pt.y],ecx
    50.                 invoke  ImageList_DragMove,eax,ecx
    51.                 invoke  ImageList_DragShowNolock,0
    52.                 invoke  SendMessage,esi,TVM_HITTEST,0,edi
    53.                 or eax,eax
    54.                 jz      @f
    55.                 invoke  SendMessage,esi,TVM_SELECTITEM,TVGN_DROPHILITE,eax
    56.   @@:           invoke  ImageList_DragShowNolock,TRUE
    57.                 jmp  wmBYE
    58. wmNOTIFY:       mov  edi,[lParam]
    59.                 cmp  [edi + NM_TREEVIEW.hdr.code],TVN_BEGINDRAG
    60.                 jne  wmBYE
    61.                 invoke  SendMessage,esi,TVM_CREATEDRAGIMAGE,0,[edi + NM_TREEVIEW.itemNew.hItem]
    62.                 mov  [imgl1DragH],eax
    63.                 invoke  ImageList_BeginDrag,eax,0,0,0
    64.                 invoke  ImageList_DragEnter,esi,[edi + NM_TREEVIEW.ptDrag.x],[edi + NM_TREEVIEW.ptDrag.y]
    65.                 invoke  SetCapture,[hWnd];eax
    66.                 or  [imgl1Drag],TRUE
    67.                 jmp  wmBYE
    68. wmLBUTTONUP:    cmp [imgl1Drag],0
    69.                 jz  wmBYE
    70.                 invoke  ImageList_DragLeave,esi
    71.                 invoke  ImageList_EndDrag
    72.                 invoke  ImageList_Destroy,[imgl1DragH]
    73.                 invoke  SendMessage,esi,TVM_GETNEXTITEM,TVGN_DROPHILITE,0
    74.                 invoke  SendMessage,esi,TVM_SELECTITEM,TVGN_CARET,eax
    75.                 invoke  SendMessage,esi,TVM_SELECTITEM,TVGN_DROPHILITE,0
    76.                 invoke  ReleaseCapture
    77.                 and [imgl1Drag],0
    78.                 jmp  wmBYE
    79. wmCREATE:       invoke  CreateWindowEx,0,ctlClsNameTv,0,\
    80.                 WS_VISIBLE + WS_CHILD + WS_BORDER + TVS_HASBUTTONS + TVS_LINESATROOT + TVS_HASLINES,\
    81.                 0,0,200,400,[hWnd],0,400000h,0
    82.                 mov  [tv1H],eax
    83.                 mov esi,eax
    84.                 invoke  ImageList_Create,16,16,ILC_COLOR16,2,10      ;with mask
    85.                 mov  edi,eax
    86.                 invoke  LoadBitmap,400000h,31
    87.                 invoke  ImageList_Add,edi,eax,0,eax         ;with mask
    88.                 invoke  DeleteObject
    89.                 invoke  SendMessage,esi,TVM_SETIMAGELIST,0,edi
    90.                 lea edi,[tv1Insert]
    91.                 mov  [edi+TV_INSERTSTRUCT.item.mask],TVIF_TEXT+TVIF_IMAGE+TVIF_SELECTEDIMAGE
    92.                 mov  [edi+TV_INSERTSTRUCT.item.pszText],tv1Txt1
    93.                 mov  [edi+TV_INSERTSTRUCT.item.iImage],0
    94.                 or  [edi+TV_INSERTSTRUCT.item.iSelectedImage],1
    95.                 invoke  SendMessage,[tv1H],TVM_INSERTITEM,0,edi
    96.                 mov  [edi+TV_INSERTSTRUCT.hParent],eax
    97.                 mov  [edi+TV_INSERTSTRUCT.hInsertAfter],TVI_LAST
    98.                 mov  [edi+TV_INSERTSTRUCT.item.pszText],tv1Txt2
    99.                 invoke  SendMessage,esi,TVM_INSERTITEM,0,edi
    100.                 mov  [edi+TV_INSERTSTRUCT.item.pszText],tv1Txt3
    101.                 invoke  SendMessage,esi,TVM_INSERTITEM,0,edi
    102.                 and [imgl1Drag],0
    103. wmBYE:          xor eax,eax
    104.                 ret
    105. wmDESTROY:      invoke  ExitProcess,0
    106. endp
    107. ;--------------------------------------------------------------------
    108. wTitle        db 'Iczelion Tutorial #19:Tree View Control in FASM',0
    109.         ctlClsNameTv    db 'SysTreeView32',0
    110.         tv1H            rd 1
    111.         tv1Txt1         db 'Node - Parent',0
    112.         tv1Txt2         db 'Node - Child 1',0
    113.         tv1Txt3         db 'Node - Child 2',0
    114.         imgl1Drag       dd FALSE
    115.         tv1Insert       TV_INSERTSTRUCT 0,TVI_ROOT
    116.         tv1HitInfo      TV_HITTESTINFO
    117.         imgl1DragH      rd 1
    118. ;---------------------------------------------------------------------
    119. data import
    120.     library     KERNEL32, 'KERNEL32.DLL',\
    121.                 USER32,   'USER32.DLL',\
    122.                 GDI32,    'GDI32.DLL',\
    123.                 COMCTL32, 'COMCTL32.DLL'
    124.  
    125.     import      KERNEL32,\
    126.                 ExitProcess,            'ExitProcess'
    127.     import      USER32,\
    128.                 RegisterClass,          'RegisterClassA',\
    129.                 CreateWindowEx,         'CreateWindowExA',\
    130.                 DefWindowProc,          'DefWindowProcA',\
    131.                 LoadBitmap,             'LoadBitmapA',\
    132.                 SendMessage,            'SendMessageA',\
    133.                 GetMessage,             'GetMessageA',\
    134.                 MessageBox,             'MessageBoxA',\
    135.                 SetCapture,             'SetCapture',\
    136.                 ReleaseCapture,         'ReleaseCapture',\
    137.                 GetParent,              'GetParent',\
    138.                 DestroyWindow,          'DestroyWindow',\
    139.                 DispatchMessage,        'DispatchMessageA'
    140.     import      GDI32,\
    141.                 DeleteObject,           'DeleteObject'
    142.     import      COMCTL32,\
    143.                 ImageList_Create,       'ImageList_Create',\
    144.                 ImageList_Add,          'ImageList_Add',\
    145.                 ImageList_AddMasked,    'ImageList_AddMasked',\
    146.                 ImageList_GetImageCount,'ImageList_GetImageCount',\
    147.                 ImageList_BeginDrag,    'ImageList_BeginDrag',\
    148.                 ImageList_EndDrag,      'ImageList_EndDrag',\
    149.                 ImageList_DragEnter,    'ImageList_DragEnter',\
    150.                 ImageList_DragMove,     'ImageList_DragMove',\
    151.                 ImageList_DragLeave,    'ImageList_DragLeave',\
    152.                 ImageList_DragShowNolock,'ImageList_DragShowNolock',\
    153.                 ImageList_Destroy,      'ImageList_Destroy'
    154. end data
    155. ;---------------------------------------
    156. section '.rsrc' resource data readable
    157.         directory       RT_BITMAP, appBmp
    158.      
    159.         resource        appBmp,\
    160.                         31,LANG_NEUTRAL,bmpA
    161.      
    162.         bitmap          bmpA, 'Images\list.bmp'
    [​IMG]
    list.bmp
    Результат
    [​IMG]
     

    Вложения:

    • tut_19.zip
      Размер файла:
      3,5 КБ
      Просмотров:
      946
    • list.png
      list.png
      Размер файла:
      296 байт
      Просмотров:
      2.782
    • 19.png
      19.png
      Размер файла:
      17 КБ
      Просмотров:
      2.826
    Последнее редактирование: 17 дек 2016
    rococo795 нравится это.
  4. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709

    Win32 API. Урок 20. Сабклассинг окна

    Код (ASM):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.         wndH            dd ?
    8.         insH            dd ?
    9.         wndClsName      db 'TUT_20',0
    10.         wndTitle        db 'Tutorial 20',0
    11.         wndProcAddr     dd ?
    12.  
    13.         wndCls  WNDCLASS
    14.         wndMsg  MSG
    15.        
    16.         ctlClsNameEdit  db 'EDIT',0
    17.        
    18.         edit1H          dd ?
    19.         edit1Txt1       db 'A simple HEX edit control!',0
    20.        
    21.        
    22. section '.code' code readable executable
    23.    start:
    24.         invoke  GetModuleHandle,0
    25.                 mov  [insH],eax
    26.                 mov  [wndCls.hInstance],eax
    27.                 mov  [wndCls.style],CS_HREDRAW or CS_VREDRAW
    28.                 mov  [wndCls.lpfnWndProc],window_procedure
    29.                 mov  [wndCls.lpszClassName],wndClsName
    30.                 mov  [wndCls.hbrBackground],COLOR_BTNFACE+1
    31.         invoke  LoadIcon,NULL,IDI_APPLICATION
    32.                 mov  [wndCls.hIcon],eax
    33.         invoke  LoadCursor,NULL,IDC_ARROW
    34.                 mov  [wndCls.hCursor],eax
    35.         invoke  RegisterClass,wndCls
    36.  
    37.         invoke  CreateWindowEx,WS_EX_CLIENTEDGE,\
    38.                 wndClsName,wndTitle,\
    39.                 WS_OVERLAPPEDWINDOW + WS_VISIBLE,\
    40.                 CW_USEDEFAULT,CW_USEDEFAULT,\
    41.                 400,240,\
    42.                 NULL,NULL,[insH],NULL
    43.                 mov  [wndH],eax
    44.  
    45.    ;+---------------------------+
    46.    ;| entering the message loop |
    47.    ;+---------------------------+
    48.    window_message_loop_start:
    49.         invoke  GetMessage,wndMsg,NULL,0,0
    50.                 or    eax,eax
    51.                 je    window_message_loop_end
    52.         invoke  TranslateMessage,wndMsg
    53.         invoke  DispatchMessage,wndMsg
    54.                 jmp     window_message_loop_start
    55.  
    56.    window_message_loop_end:
    57.         invoke  ExitProcess,0
    58.  
    59.    ;+----------------------+
    60.    ;| the window procedure |
    61.    ;+----------------------+
    62.    proc window_procedure,hWnd,uMsg,wParam,lParam
    63.                 push ebx esi edi
    64.                 cmp  [uMsg],WM_CREATE
    65.                 je   wmCREATE
    66.                 cmp  [uMsg],WM_DESTROY
    67.                 je   wmDESTROY
    68.        
    69.  
    70.         wmDEFAULT:
    71.                 invoke  DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    72.                         jmp  wmBYE
    73.         wmCREATE:
    74.                 invoke  CreateWindowEx,WS_EX_CLIENTEDGE,ctlClsNameEdit,NULL,\
    75.                         WS_CHILD + WS_VISIBLE + WS_BORDER,\
    76.                         20,20,300,24,\
    77.                         [hWnd],NULL,[insH],NULL
    78.                         mov  [edit1H],eax
    79.                 invoke  SetFocus,eax
    80.                 invoke  SetWindowLong,[edit1H],GWL_WNDPROC,edit1_procedure
    81.                         mov  [wndProcAddr],eax
    82.                         jmp  wmBYE
    83.         wmDESTROY:
    84.                 invoke  PostQuitMessage,0
    85.  
    86.         wmBYE:
    87.                 pop edi esi ebx
    88.                 return
    89.    endp
    90.    
    91.    proc edit1_procedure,hWnd,uMsg,wParam,lParam
    92.                 push ebx esi edi
    93.                 cmp  [uMsg],WM_CHAR
    94.                 je   edit1_wmCHAR
    95.                 cmp  [uMsg],WM_KEYDOWN
    96.                 je   edit1_wmKEYDOWN
    97.                 jmp  @f
    98.        
    99.         edit1_wmCHAR:
    100.                         mov  eax,[wParam]
    101.                         cmp  al,VK_BACK         ;compare with virtual key BACKSPACE
    102.                         je   @f
    103.                         cmp  al,0x30            ;compare with ascii 0
    104.                         jb   edit1_wmBYE
    105.                         cmp  al,0x39            ;compare with ascii 9
    106.                         jbe  @f
    107.                         cmp  al,0x41            ;compare with ascii A
    108.                         jb   edit1_wmBYE
    109.                         cmp  al,0x46            ;compare with ascii F
    110.                         jbe  @f
    111.                         cmp  al,0x61            ;compare with ascii a
    112.                         jb   edit1_wmBYE
    113.                         cmp  al,0x66            ;compare with ascii f
    114.                         jbe  wmCHAR_add
    115.                         jmp  edit1_wmBYE        ;something else
    116.                
    117.                 wmCHAR_add:
    118.                         sub  [wParam],0x20      ;so our AL become big letter
    119.                         jmp  @f
    120.                 @@:
    121.                         invoke  CallWindowProc,[wndProcAddr],[hWnd],[uMsg],[wParam],[lParam]
    122.                                 jmp  edit1_wmBYE
    123.        
    124.         edit1_wmKEYDOWN:
    125.                         mov  eax,[wParam]
    126.                         cmp  al,VK_RETURN       ;compare with virtual key RETURN
    127.                         jne  @b
    128.                 invoke  MessageBox,[hWnd],edit1Txt1,wndTitle,MB_OK
    129.                 invoke  SetFocus,[hWnd]
    130.        
    131.         edit1_wmBYE:
    132.                         pop  edi esi ebx
    133.                         return
    134.    endp
    135.  
    136. section '.idata' import data readable
    137.     library     KERNEL32, 'KERNEL32.DLL',\
    138.                 USER32,   'USER32.DLL'
    139.    
    140.     import      KERNEL32,\
    141.                 GetModuleHandle,        'GetModuleHandleA',\
    142.                 ExitProcess,            'ExitProcess'
    143.     import      USER32,\
    144.                 RegisterClass,          'RegisterClassA',\
    145.                 CreateWindowEx,         'CreateWindowExA',\
    146.                 DefWindowProc,          'DefWindowProcA',\
    147.                 LoadCursor,             'LoadCursorA',\
    148.                 LoadIcon,               'LoadIconA',\
    149.                 SendMessage,            'SendMessageA',\
    150.                 GetMessage,             'GetMessageA',\
    151.                 MessageBox,             'MessageBoxA',\
    152.                 SetFocus,               'SetFocus',\
    153.                 SetWindowLong,          'SetWindowLongA',\
    154.                 CallWindowProc,         'CallWindowProcA',\
    155.                 DestroyWindow,          'DestroyWindow',\
    156.                 TranslateMessage,       'TranslateMessage',\
    157.                 DispatchMessage,        'DispatchMessageA',\
    158.                 PostQuitMessage,        'PostQuitMessage'
    159.  
    Результат
    [​IMG]
     

    Вложения:

    • tut_20.gif
      tut_20.gif
      Размер файла:
      4,1 КБ
      Просмотров:
      3.188
    rococo795 нравится это.
  5. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709

    Win32 API. Урок 21. Пайп

    Код (ASM):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. struct SECURITY_ATTRIBUTES
    7.         .nLength                dd ?
    8.         .lpSecurityDescriptor   dd ?
    9.         .bInheritHandle         dd ?
    10. ends
    11.  
    12. MI_CSCRIPT      equ 100
    13.  
    14. section '.data' data readable writeable
    15.         wndH            dd ?
    16.         insH            dd ?
    17.         wndClsName      db 'TUT_21',0
    18.         wndTitle        db 'Tutorial 21',0
    19.  
    20.         wndCls  WNDCLASS
    21.         wndMsg  MSG
    22.  
    23.         pipeSecAttr     SECURITY_ATTRIBUTES
    24.         pipeReadH       dd ?
    25.         pipeWriteH      dd ?
    26.         pipeRead        dd ?
    27.         pipeBuffer      rb 0x400
    28.  
    29.         pro1StartInfo   STARTUPINFO
    30.         pro1Info        PROCESS_INFORMATION
    31.         pro1CmdLine     db 'cscript',0
    32.  
    33.         ctlClsNameEdit  db 'EDIT',0
    34.        
    35.         edit1H          dd ?
    36.        
    37.         errStr1         db 'Error - Pipe Creation Failed!',0
    38.         errStr2         db 'Error - Process Creation Failed!',0
    39.        
    40. section '.code' code readable executable
    41.    start:
    42.         invoke  GetModuleHandle,0
    43.                 mov  [insH],eax
    44.                 mov  [wndCls.hInstance],eax
    45.                 mov  [wndCls.style],CS_HREDRAW or CS_VREDRAW
    46.                 mov  [wndCls.lpfnWndProc],window_procedure
    47.                 mov  [wndCls.lpszClassName],wndClsName
    48.                 mov  [wndCls.lpszMenuName],30
    49.                 mov  [wndCls.hbrBackground],COLOR_APPWORKSPACE
    50.         invoke  LoadIcon,NULL,IDI_APPLICATION
    51.                 mov  [wndCls.hIcon],eax
    52.         invoke  LoadCursor,NULL,IDC_ARROW
    53.                 mov  [wndCls.hCursor],eax
    54.         invoke  RegisterClass,wndCls
    55.  
    56.         invoke  CreateWindowEx,WS_EX_CLIENTEDGE,\
    57.                 wndClsName,wndTitle,\
    58.                 WS_OVERLAPPEDWINDOW + WS_VISIBLE,\
    59.                 CW_USEDEFAULT,CW_USEDEFAULT,\
    60.                 600,350,\
    61.                 NULL,NULL,[insH],NULL
    62.                 mov  [wndH],eax
    63.  
    64.    ;+---------------------------+
    65.    ;| entering the message loop |
    66.    ;+---------------------------+
    67.    window_message_loop_start:
    68.         invoke  GetMessage,wndMsg,NULL,0,0
    69.                 or    eax,eax
    70.                 je    window_message_loop_end
    71.         invoke  TranslateMessage,wndMsg
    72.         invoke  DispatchMessage,wndMsg
    73.                 jmp     window_message_loop_start
    74.  
    75.    window_message_loop_end:
    76.         invoke  ExitProcess,0
    77.  
    78.    ;+----------------------+
    79.    ;| the window procedure |
    80.    ;+----------------------+
    81.    proc window_procedure,hWnd,uMsg,wParam,lParam
    82.                 push ebx esi edi
    83.                 cmp  [uMsg],WM_CREATE
    84.                 je   wmCREATE
    85.                 cmp  [uMsg],WM_SIZE
    86.                 je   wmSIZE
    87.                 cmp  [uMsg],WM_COMMAND
    88.                 je   wmCOMMAND
    89.                 cmp  [uMsg],WM_CTLCOLOREDIT
    90.                 je   wmCTLCOLOREDIT
    91.                 cmp  [uMsg],WM_DESTROY
    92.                 je   wmDESTROY
    93.        
    94.  
    95.         wmDEFAULT:
    96.                 invoke  DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    97.                         jmp  wmBYE
    98.         wmCTLCOLOREDIT:
    99.                 invoke  SetTextColor,[wParam],0x00C9B5AF
    100.                 invoke  SetBkColor,[wParam],0x00000000
    101.                 invoke  GetStockObject,BLACK_BRUSH
    102.                         jmp  wmBYE
    103.         wmCOMMAND:
    104.                         cmp  [wParam],0xFFFF and MI_CSCRIPT
    105.                         je   wmCOMMAND_MI_CSCRIPT
    106.                         jmp  wmBYE
    107.                
    108.                 wmCOMMAND_MI_CSCRIPT:
    109.                                 mov  [pipeSecAttr.nLength], sizeof.SECURITY_ATTRIBUTES
    110.                                 mov  [pipeSecAttr.lpSecurityDescriptor],NULL
    111.                                 mov  [pipeSecAttr.bInheritHandle],TRUE
    112.                         invoke  CreatePipe,pipeReadH,pipeWriteH,pipeSecAttr,NULL
    113.                                 cmp  eax,NULL
    114.                                 je   MI_CSCRIPT_error_pipe
    115.                                 mov  [pro1StartInfo.cb],sizeof.STARTUPINFO
    116.                         invoke  GetStartupInfo,pro1StartInfo
    117.                                 mov  eax,[pipeWriteH]
    118.                                 mov  [pro1StartInfo.hStdOutput],eax
    119.                                 mov  [pro1StartInfo.hStdError],eax
    120.                                 mov  [pro1StartInfo.dwFlags],STARTF_USESHOWWINDOW + STARTF_USESTDHANDLES
    121.                                 mov  [pro1StartInfo.wShowWindow],SW_HIDE
    122.                                 ;+----------------+
    123.                                 ;| create process |
    124.                                 ;+----------------+
    125.                         invoke  CreateProcess,NULL,pro1CmdLine,NULL,NULL,TRUE,NULL,NULL,NULL,pro1StartInfo,pro1Info
    126.                                 cmp  eax,NULL
    127.                                 je   MI_CSCRIPT_error_process
    128.                         @@:
    129.                         invoke  CloseHandle,[pipeWriteH]
    130.                                 cmp  eax,TRUE
    131.                                 jne  @b
    132.                         invoke  RtlZeroMemory,pipeBuffer,0x400
    133.                         invoke  ReadFile,[pipeReadH],pipeBuffer,1023,pipeRead,NULL
    134.                                 cmp  eax,NULL
    135.                                 je   @f
    136.                         invoke  SendMessage,[edit1H],EM_SETSEL,-1,0
    137.                         invoke  SendMessage,[edit1H],EM_REPLACESEL,FALSE,pipeBuffer
    138.                         ;invoke SendMessage,[edit1H],WM_SETTEXT,0,pipeBuffer            ;edit control only contain pipeBuffer
    139.                                 jmp  @f
    140.                        
    141.                         MI_CSCRIPT_error_pipe:
    142.                                 invoke  MessageBox,[hWnd],errStr1,wndTitle,MB_OK
    143.                                         jmp  wmBYE
    144.                         MI_CSCRIPT_error_process:
    145.                                 invoke  MessageBox,[hWnd],errStr2,wndTitle,MB_OK
    146.                         @@:
    147.                                 invoke  CloseHandle,[pipeReadH]
    148.                                 invoke  CloseHandle,[pro1Info.hProcess]
    149.                                 invoke  CloseHandle,[pro1Info.hThread]
    150.                                         jmp  wmBYE
    151.                
    152.         wmSIZE:
    153.                         mov  edx,[lParam]
    154.                         mov  ecx,edx
    155.                         shr  ecx,16             ;height - high order
    156.                         and  edx,0xFFFF         ;width  - low order
    157.                 invoke  MoveWindow,[edit1H],0,0,edx,ecx,TRUE
    158.                         jmp  wmBYE
    159.         wmCREATE:
    160.                 invoke  CreateWindowEx,NULL,ctlClsNameEdit,NULL,\
    161.                         WS_CHILD + WS_VISIBLE + WS_HSCROLL + WS_VSCROLL + ES_MULTILINE + ES_AUTOHSCROLL + ES_AUTOVSCROLL,\
    162.                         0,0,0,0,\
    163.                         [hWnd],NULL,[insH],NULL
    164.                         mov  [edit1H],eax
    165.                         jmp  wmBYE
    166.         wmDESTROY:
    167.                 invoke  PostQuitMessage,0
    168.  
    169.         wmBYE:
    170.                 pop edi esi ebx
    171.                 return
    172.    endp
    173.  
    174. section '.idata' import data readable
    175.     library     KERNEL32, 'KERNEL32.DLL',\
    176.                 USER32,   'USER32.DLL',\
    177.                 GDI32,    'GDI32.DLL'
    178.    
    179.     import      KERNEL32,\
    180.                 GetModuleHandle,        'GetModuleHandleA',\
    181.                 CreatePipe,             'CreatePipe',\
    182.                 CloseHandle,            'CloseHandle',\
    183.                 CreateProcess,          'CreateProcessA',\
    184.                 GetStartupInfo,         'GetStartupInfoA',\
    185.                 RtlZeroMemory,          'RtlZeroMemory',\
    186.                 ReadFile,               'ReadFile',\
    187.                 ExitProcess,            'ExitProcess'
    188.     import      USER32,\
    189.                 RegisterClass,          'RegisterClassA',\
    190.                 CreateWindowEx,         'CreateWindowExA',\
    191.                 DefWindowProc,          'DefWindowProcA',\
    192.                 LoadCursor,             'LoadCursorA',\
    193.                 LoadIcon,               'LoadIconA',\
    194.                 SendMessage,            'SendMessageA',\
    195.                 GetMessage,             'GetMessageA',\
    196.                 MessageBox,             'MessageBoxA',\
    197.                 MoveWindow,             'MoveWindow',\
    198.                 DestroyWindow,          'DestroyWindow',\
    199.                 TranslateMessage,       'TranslateMessage',\
    200.                 DispatchMessage,        'DispatchMessageA',\
    201.                 PostQuitMessage,        'PostQuitMessage'
    202.     import      GDI32,\
    203.                 SetTextColor,           'SetTextColor',\
    204.                 SetBkColor,             'SetBkColor',\
    205.                 GetStockObject,         'GetStockObject'
    206.  
    207. section '.rsrc' resource data readable
    208.         directory       RT_MENU,appMenu
    209.        
    210.         resource        appMenu,\
    211.                         30,LANG_NEUTRAL,menuMain
    212.  
    213.         menu    menuMain
    214.                 menuitem        '&Action',0,MFR_POPUP + MFR_END
    215.                 menuitem                '&Cscript',MI_CSCRIPT,MFR_END[FONT=Georgia]
    Результат[/FONT]
    [​IMG]
     

    Вложения:

    • tut_21.gif
      tut_21.gif
      Размер файла:
      9,1 КБ
      Просмотров:
      2.871
    rococo795 нравится это.
  6. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709

    Win32 API. Урок 22. Суперклассинг

    Код (ASM):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.         wndH            dd ?
    8.         insH            dd ?
    9.         wndClsName      db 'TUT_22',0
    10.         wndTitle        db 'Tutorial 22',0
    11.         wndProcAddr     dd ?
    12.  
    13.         wndCls  WNDCLASS
    14.         wndMsg  MSG
    15.        
    16.         ctlClsNameEdit          db 'EDIT',0
    17.         ctlClsNameEditHex       db 'EDIT_HEX',0
    18.        
    19.         editH:          times 6 dd ?
    20.         editHBuffer     dw 16   ;2 bytes here
    21.                         rb 14   ;14 + 2 = 16 bytes required, 15 for text, 1 for null terminated byte
    22.        
    23. section '.code' code readable executable
    24.    start:
    25.         invoke  GetModuleHandle,0
    26.                 mov  [insH],eax
    27.                 mov  [wndCls.hInstance],eax
    28.                 mov  [wndCls.style],CS_HREDRAW or CS_VREDRAW
    29.                 mov  [wndCls.lpfnWndProc],window_procedure
    30.                 mov  [wndCls.lpszClassName],wndClsName
    31.                 mov  [wndCls.hbrBackground],COLOR_BTNFACE+1
    32.         invoke  LoadIcon,NULL,IDI_APPLICATION
    33.                 mov  [wndCls.hIcon],eax
    34.         invoke  LoadCursor,NULL,IDC_ARROW
    35.                 mov  [wndCls.hCursor],eax
    36.         invoke  RegisterClass,wndCls
    37.  
    38.         invoke  CreateWindowEx,WS_EX_CLIENTEDGE,\
    39.                 wndClsName,wndTitle,\
    40.                 WS_OVERLAPPEDWINDOW + WS_VISIBLE,\
    41.                 CW_USEDEFAULT,CW_USEDEFAULT,\
    42.                 400,240,\
    43.                 NULL,NULL,[insH],NULL
    44.                 mov  [wndH],eax
    45.  
    46.    ;+---------------------------+
    47.    ;| entering the message loop |
    48.    ;+---------------------------+
    49.    window_message_loop_start:
    50.         invoke  GetMessage,wndMsg,NULL,0,0
    51.                 or    eax,eax
    52.                 je    window_message_loop_end
    53.         invoke  TranslateMessage,wndMsg
    54.         invoke  DispatchMessage,wndMsg
    55.                 jmp     window_message_loop_start
    56.  
    57.    window_message_loop_end:
    58.         invoke  ExitProcess,0
    59.  
    60.    ;+----------------------+
    61.    ;| the window procedure |
    62.    ;+----------------------+
    63.    proc window_procedure,hWnd,uMsg,wParam,lParam
    64.         editCls WNDCLASSEX
    65.         counter dd 0
    66.         enter
    67.                 push ebx esi edi
    68.                 cmp  [uMsg],WM_CREATE
    69.                 je   wmCREATE
    70.                 cmp  [uMsg],WM_DESTROY
    71.                 je   wmDESTROY
    72.        
    73.  
    74.         wmDEFAULT:
    75.                 invoke  DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    76.                         jmp  wmBYE
    77.         wmCREATE:
    78.                         mov  [editCls.cbSize],sizeof.WNDCLASSEX
    79.                         lea  ebx,[editCls]
    80.                 invoke  GetClassInfoEx,NULL,ctlClsNameEdit,ebx
    81.                         push [editCls.lpfnWndProc]
    82.                         pop  [wndProcAddr]
    83.                         mov  [editCls.lpfnWndProc],edit_hex_procedure
    84.                         push [insH]
    85.                         pop  [editCls.hInstance]
    86.                         mov  [editCls.lpszClassName],ctlClsNameEditHex
    87.                 invoke  RegisterClassEx,ebx
    88.                         xor  ebx,ebx
    89.                         mov  edi,20
    90.                 @@:
    91.                         cmp  ebx,3
    92.                         je   @f
    93.                 invoke  CreateWindowEx,WS_EX_CLIENTEDGE,ctlClsNameEditHex,NULL,\
    94.                         WS_CHILD + WS_VISIBLE + WS_BORDER,\
    95.                         20,edi,300,24,\
    96.                         [hWnd],NULL,[insH],NULL
    97.                         mov  [editH + 4 * ebx],eax
    98.                 invoke  SendMessage,eax,EM_LIMITTEXT,15,0               ;limit to 15 chars
    99.                         inc  ebx
    100.                         add  edi,30
    101.                         jmp  @b
    102.                 @@:
    103.                 invoke  SetFocus,[editH]
    104.                         jmp  wmBYE
    105.         wmDESTROY:
    106.                 invoke  PostQuitMessage,0
    107.  
    108.         wmBYE:
    109.                 pop edi esi ebx
    110.                 return
    111.    endp
    112.    
    113.    proc edit_hex_procedure,hWnd,uMsg,wParam,lParam
    114.                 push ebx esi edi
    115.                 cmp  [uMsg],WM_CHAR
    116.                 je   edit_hex_wmCHAR
    117.                 cmp  [uMsg],WM_KEYDOWN
    118.                 je   edit_hex_wmKEYDOWN
    119.                 jmp  @f
    120.        
    121.  
    122.         edit_hex_wmCHAR:
    123.                         mov  eax,[wParam]
    124.                         cmp  al,VK_BACK         ;compare with virtual key BACKSPACE
    125.                         je   @f
    126.                         cmp  al,0x30            ;compare with ascii 0
    127.                         jb   edit_hex_wmBYE
    128.                         cmp  al,0x39            ;compare with ascii 9
    129.                         jbe  @f
    130.                         cmp  al,0x41            ;compare with ascii A
    131.                         jb   edit_hex_wmBYE
    132.                         cmp  al,0x46            ;compare with ascii F
    133.                         jbe  @f
    134.                         cmp  al,0x61            ;compare with ascii a
    135.                         jb   edit_hex_wmBYE
    136.                         cmp  al,0x66            ;compare with ascii f
    137.                         jbe  wmCHAR_add
    138.                         jmp  edit_hex_wmBYE     ;something else
    139.                
    140.                 wmCHAR_add:
    141.                         sub  [wParam],0x20      ;so our AL become big letter
    142.                         jmp  @f
    143.                 @@:
    144.                         invoke  CallWindowProc,[wndProcAddr],[hWnd],[uMsg],[wParam],[lParam]
    145.                                 jmp  edit_hex_wmBYE
    146.        
    147.  
    148.         edit_hex_wmKEYDOWN:
    149.                         mov  eax,[wParam]
    150.                         cmp  al,VK_RETURN       ;compare with virtual key RETURN
    151.                         je   wmKEYDOWN_VK_RETURN
    152.                         cmp  al,VK_TAB
    153.                         je   wmKEYDOWN_VK_TAB
    154.                         jne  @b
    155.  
    156.                 wmKEYDOWN_VK_TAB:
    157.                         invoke  GetKeyState,VK_SHIFT
    158.                                 test eax,0x80000000
    159.                                 je   VK_TAB_NEXT
    160.                                 jmp  VK_TAB_PREV
    161.                        
    162.                         VK_TAB_NEXT:
    163.                                 invoke  GetWindow,[hWnd],GW_HWNDNEXT
    164.                                         cmp  eax,NULL
    165.                                         jne  VK_TAB_BYE
    166.                                 invoke  GetWindow,[hWnd],GW_HWNDFIRST
    167.                                         jmp  VK_TAB_BYE
    168.                         VK_TAB_PREV:
    169.                                 invoke  GetWindow,[hWnd],GW_HWNDPREV
    170.                                         cmp  eax,NULL
    171.                                         jne  VK_TAB_BYE
    172.                                 invoke  GetWindow,[hWnd],GW_HWNDLAST
    173.                                         jmp  VK_TAB_BYE
    174.                        
    175.                         VK_TAB_BYE:
    176.                                 invoke  SetFocus,eax
    177.                                         xor  eax,eax
    178.                                         jmp  edit_hex_wmBYE
    179.  
    180.                 wmKEYDOWN_VK_RETURN:
    181.                         invoke  SendMessage,[hWnd],EM_GETLINE,0,editHBuffer
    182.                         invoke  MessageBox,[hWnd],editHBuffer,wndTitle,MB_OK
    183.                         invoke  SetFocus,[hWnd]
    184.                                 jmp  edit_hex_wmBYE
    185.  
    186.         edit_hex_wmBYE:
    187.                         pop  edi esi ebx
    188.                         return
    189.    endp
    190.  
    191. section '.idata' import data readable
    192.     library     KERNEL32, 'KERNEL32.DLL',\
    193.                 USER32,   'USER32.DLL'
    194.    
    195.     import      KERNEL32,\
    196.                 GetModuleHandle,        'GetModuleHandleA',\
    197.                 ExitProcess,            'ExitProcess'
    198.     import      USER32,\
    199.                 RegisterClass,          'RegisterClassA',\
    200.                 RegisterClassEx,        'RegisterClassExA',\
    201.                 CreateWindowEx,         'CreateWindowExA',\
    202.                 DefWindowProc,          'DefWindowProcA',\
    203.                 LoadCursor,             'LoadCursorA',\
    204.                 LoadIcon,               'LoadIconA',\
    205.                 SendMessage,            'SendMessageA',\
    206.                 GetMessage,             'GetMessageA',\
    207.                 MessageBox,             'MessageBoxA',\
    208.                 GetClassInfoEx,         'GetClassInfoExA',\
    209.                 GetKeyState,            'GetKeyState',\
    210.                 GetWindow,              'GetWindow',\
    211.                 SetFocus,               'SetFocus',\
    212.                 SetWindowLong,          'SetWindowLongA',\
    213.                 CallWindowProc,         'CallWindowProcA',\
    214.                 DestroyWindow,          'DestroyWindow',\
    215.                 TranslateMessage,       'TranslateMessage',\
    216.                 DispatchMessage,        'DispatchMessageA',\
    217.                 PostQuitMessage,        'PostQuitMessage'[FONT=Georgia]
    Результат

    [​IMG][/FONT]
     

    Вложения:

    • tut_22.gif
      tut_22.gif
      Размер файла:
      4,2 КБ
      Просмотров:
      2.895
    rococo795 нравится это.
  7. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709

    Win32 API. Урок 23. Иконка в system tray

    Код (ASM):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. WUM_SHELLNOTIFY equ WM_USER + 5
    7. MI_RESTORE    equ 1000
    8. MI_EXIT        equ 1001
    9. SBI_TRAY    equ 0
    10.  
    11. section '.data' data readable writeable
    12.     wndH        dd ?
    13.     insH        dd ?
    14.     wndClsName    db 'TUT_23',0
    15.     wndTitle    db 'Tutorial 23',0
    16.  
    17.     wndCls    WNDCLASS
    18.     wndMsg    MSG
    19.    
    20.     menuH        dd ?
    21.     menuPt        POINT
    22.     menuRect    RECT
    23.     miRESTORE    db '&Restore',0
    24.     miEXIT        db '&Exit',0
    25.    
    26.     statBarData    NOTIFYICONDATA
    27.    
    28. section '.code' code readable executable
    29.    start:
    30.     invoke    GetModuleHandle,0
    31.         mov  [insH],eax
    32.         mov  [wndCls.hInstance],eax
    33.         mov  [wndCls.style],CS_HREDRAW or CS_VREDRAW
    34.         mov  [wndCls.lpfnWndProc],window_procedure
    35.         mov  [wndCls.lpszClassName],wndClsName
    36.         mov  [wndCls.hbrBackground],COLOR_BTNFACE+1
    37.     invoke    LoadIcon,NULL,IDI_APPLICATION
    38.         mov  [wndCls.hIcon],eax
    39.     invoke    LoadCursor,NULL,IDC_ARROW
    40.         mov  [wndCls.hCursor],eax
    41.     invoke    RegisterClass,wndCls
    42.  
    43.     invoke    CreateWindowEx,WS_EX_CLIENTEDGE,\
    44.         wndClsName,wndTitle,\
    45.         WS_OVERLAPPEDWINDOW + WS_VISIBLE,\
    46.         CW_USEDEFAULT,CW_USEDEFAULT,\
    47.         400,240,\
    48.         NULL,NULL,[insH],NULL
    49.         mov  [wndH],eax
    50.  
    51.    ;+---------------------------+
    52.    ;| entering the message loop |
    53.    ;+---------------------------+
    54.    window_message_loop_start:
    55.     invoke    GetMessage,wndMsg,NULL,0,0
    56.         or    eax,eax
    57.         je    window_message_loop_end
    58.     invoke    TranslateMessage,wndMsg
    59.     invoke    DispatchMessage,wndMsg
    60.         jmp    window_message_loop_start
    61.  
    62.    window_message_loop_end:
    63.     invoke    ExitProcess,0
    64.  
    65.    ;+----------------------+
    66.    ;| the window procedure |
    67.    ;+----------------------+
    68.    proc window_procedure,hWnd,uMsg,wParam,lParam
    69.         push ebx esi edi
    70.         cmp  [uMsg],WUM_SHELLNOTIFY
    71.         je   wumSHELLNOTIFY
    72.         cmp  [uMsg],WM_COMMAND
    73.         je   wmCOMMAND
    74.         cmp  [uMsg],WM_SIZE
    75.         je   wmSIZE
    76.         cmp  [uMsg],WM_CREATE
    77.         je   wmCREATE
    78.         cmp  [uMsg],WM_DESTROY
    79.         je   wmDESTROY
    80.    
    81.  
    82.     wmDEFAULT:
    83.         invoke    DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    84.             jmp  wmBYE
    85.    
    86.  
    87.     wumSHELLNOTIFY:
    88.             cmp  [wParam],SBI_TRAY
    89.             jne  wmBYE
    90.             cmp  [lParam],WM_RBUTTONDOWN
    91.             je   wumSHELLNOTIFY_WM_RBUTTONDOWN
    92.             cmp  [lParam],WM_LBUTTONDBLCLK
    93.             je   wumSHELLNOTIFY_WM_LBUTTONDBLCLK
    94.             jmp  wmBYE
    95.        
    96.         wumSHELLNOTIFY_WM_LBUTTONDBLCLK:
    97.             invoke    SendMessage,[hWnd],WM_COMMAND,MI_RESTORE,0
    98.                 jmp  wmBYE
    99.        
    100.         wumSHELLNOTIFY_WM_RBUTTONDOWN:
    101.             invoke    GetCursorPos,menuPt
    102.             invoke    SetForegroundWindow,[hWnd]
    103.             invoke    TrackPopupMenu,[menuH],TPM_RIGHTALIGN + TPM_RIGHTBUTTON,\
    104.                 [menuPt.x],[menuPt.y],NULL,[hWnd],NULL
    105.             invoke    PostMessage,[hWnd],WM_NULL,0,0
    106.                 jmp  wmBYE
    107.        
    108.     wmCOMMAND:
    109.             cmp  [lParam],0        ;message is not from control
    110.             jne  wmBYE
    111.         invoke    Shell_NotifyIcon,NIM_DELETE,statBarData
    112.             mov  eax,[wParam]
    113.             cmp  ax,MI_RESTORE
    114.             je   wmCOMMAND_MI_RESTORE
    115.         invoke    DestroyWindow,[hWnd]
    116.             jmp  wmBYE
    117.        
    118.         wmCOMMAND_MI_RESTORE:
    119.             invoke    ShowWindow,[hWnd],SW_RESTORE
    120.                 jmp  wmBYE
    121.     wmSIZE:
    122.             cmp  [wParam],SIZE_MINIMIZED
    123.             jne  wmBYE
    124.             mov  [statBarData.cbSize],sizeof.NOTIFYICONDATA
    125.             push [hWnd]
    126.             pop  [statBarData.hWnd]
    127.             mov  [statBarData.uID],SBI_TRAY
    128.             mov  [statBarData.uFlags],NIF_ICON + NIF_MESSAGE + NIF_TIP
    129.             mov  [statBarData.uCallbackMessage],WUM_SHELLNOTIFY
    130.         invoke    LoadIcon,NULL,IDI_WINLOGO
    131.             mov  [statBarData.hIcon],eax
    132.         invoke    lstrcpy,statBarData.szTip,wndTitle
    133.         invoke    ShowWindow,[hWnd],SW_HIDE
    134.         invoke    Shell_NotifyIcon,NIM_ADD,statBarData
    135.             jmp  wmBYE
    136.     wmCREATE:
    137.         invoke    CreatePopupMenu
    138.             mov  [menuH],eax
    139.         invoke    AppendMenu,[menuH],MF_STRING,MI_RESTORE,miRESTORE
    140.         invoke    AppendMenu,[menuH],MF_STRING,MI_EXIT,miEXIT
    141.             jmp  wmBYE
    142.     wmDESTROY:
    143.         invoke    DestroyMenu,[menuH]
    144.         invoke    PostQuitMessage,0
    145.  
    146.     wmBYE:
    147.         pop edi esi ebx
    148.         return
    149.    endp
    150.  
    151. section '.idata' import data readable
    152.     library    KERNEL32, 'KERNEL32.DLL',\
    153.         USER32,   'USER32.DLL',\
    154.         SHELL32,  'SHELL32.DLL'
    155.    
    156.     import    KERNEL32,\
    157.         GetModuleHandle,    'GetModuleHandleA',\
    158.         lstrcpy,        'lstrcpyA',\
    159.         ExitProcess,        'ExitProcess'
    160.     import    USER32,\
    161.         RegisterClass,        'RegisterClassA',\
    162.         CreateWindowEx,        'CreateWindowExA',\
    163.         DefWindowProc,        'DefWindowProcA',\
    164.         LoadCursor,        'LoadCursorA',\
    165.         LoadIcon,        'LoadIconA',\
    166.         SendMessage,        'SendMessageA',\
    167.         GetMessage,        'GetMessageA',\
    168.         MessageBox,        'MessageBoxA',\
    169.         CreatePopupMenu,    'CreatePopupMenu',\
    170.         DestroyMenu,        'DestroyMenu',\
    171.         AppendMenu,        'AppendMenuA',\
    172.         GetCursorPos,        'GetCursorPos',\
    173.         SetForegroundWindow,    'SetForegroundWindow',\
    174.         TrackPopupMenu,        'TrackPopupMenu',\
    175.         PostMessage,        'PostMessageA',\
    176.         ShowWindow,        'ShowWindow',\
    177.         DestroyWindow,        'DestroyWindow',\
    178.         TranslateMessage,    'TranslateMessage',\
    179.         DispatchMessage,    'DispatchMessageA',\
    180.         PostQuitMessage,    'PostQuitMessage'
    181.    import    SHELL32,\
    182.         Shell_NotifyIcon,    'Shell_NotifyIcon'
    Результат

    [​IMG]

    [​IMG]

    [​IMG]
     

    Вложения:

    • tut_23a.gif
      tut_23a.gif
      Размер файла:
      1,2 КБ
      Просмотров:
      2.800
    • tut_23b.gif
      tut_23b.gif
      Размер файла:
      1,6 КБ
      Просмотров:
      2.760
    • tut_23c.gif
      tut_23c.gif
      Размер файла:
      1,6 КБ
      Просмотров:
      2.802
    rococo795 нравится это.
  8. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709

    Win32 API. Урок 24. Windows-хуки

    Текст tut_24a.asm
    Код (ASM):
    1. format PE GUI 4.0 DLL
    2. entry DllMain
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. struct MOUSEHOOKSTRUCT
    7.         .pt             POINT
    8.         .hwnd           dd ?
    9.         .wHitTestCode   dd ?
    10.         .dwExtraInfo    dd ?
    11. ends
    12.  
    13. WMU_MOUSEHOOK equ WM_USER + 6
    14.  
    15. section '.data' data readable writeable
    16.         insH            dd ?                    ;handle for instance
    17.  
    18. section '.sdata' readable writeable shareable
    19.         hookH   dd ?
    20.         wndH    dd ?
    21.  
    22. section '.code' code readable executable
    23.    proc DllMain, hinstDll, fdwReason, lpvReserved
    24.                 push [hinstDll]
    25.                 pop  [insH]
    26.                 mov  eax,TRUE
    27.                 return
    28.    endp
    29.        
    30.    proc mouse_procedure,nCode,wParam,lParam
    31.         invoke  CallNextHookEx,[hookH],[nCode],[wParam],[lParam]
    32.                 mov  edx,[lParam]
    33.         invoke  WindowFromPoint,[edx + MOUSEHOOKSTRUCT.pt.x],[edx + MOUSEHOOKSTRUCT.pt.y]
    34.         invoke  PostMessage,[wndH],WMU_MOUSEHOOK,eax,0
    35.                 xor  eax,eax            ;must clear eax here
    36.                 return
    37.    endp
    38.    
    39.    proc mouse_hook_install,wndTempH
    40.                 push [wndTempH]
    41.                 pop  [wndH]
    42.         invoke  SetWindowsHookEx,WH_MOUSE,mouse_procedure,[insH],NULL
    43.                 mov  [hookH],eax
    44.                 return
    45.    endp
    46.  
    47.    proc mouse_hook_uninstall
    48.         invoke  UnhookWindowsHookEx,[hookH]
    49.                 return
    50.    endp
    51.  
    52. section '.idata' import data readable
    53.         library USER32, 'USER32.DLL'
    54.  
    55.         import  USER32,\
    56.                 CallNextHookEx,         'CallNextHookEx',\
    57.                 WindowFromPoint,        'WindowFromPoint',\
    58.                 PostMessage,            'PostMessageA',\
    59.                 SetWindowsHookEx,       'SetWindowsHookExA',\
    60.                 UnhookWindowsHookEx,    'UnhookWindowsHookEx'
    61.  
    62. section '.edata' export data readable
    63.         export  'TUT_24A.DLL',\
    64.                 mouse_procedure,        'mouse_procedure',\
    65.                 mouse_hook_install,     'mouse_hook_install',\
    66.                 mouse_hook_uninstall,   'mouse_hook_uninstall'
    67.  
    68. section '.reloc' fixups data discardable
    69.  
    Текст tut_24b.asm
    Код (ASM):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. WMU_MOUSEHOOK   equ WM_USER + 6
    7. DLG_MAIN        equ 101
    8. EDIT_CLSNAME    equ 1001
    9. EDIT_HANDLE     equ 1002
    10. EDIT_WNDPROC    equ 1003
    11. BTN_HOOK        equ 1004
    12. BTN_EXIT        equ 1005
    13.  
    14. section '.data' data readable writeable
    15.         insH            dd ?
    16.         wndClsName      db 'TUT_24B',0
    17.         wndTitle        db 'Tutorial 24B',0
    18.  
    19.         wndCls  WNDCLASS
    20.         wndMsg  MSG
    21.        
    22.         hookFlag        dd FALSE
    23.         hookH           dd ?
    24.         rect            RECT
    25.         txtUnhook       db '&Unhook',0
    26.         txtHook         db '&Hook',0
    27.  
    28.         buf1    rb 128
    29.         buf2    rb 128
    30.         f1      db '0x%lX',0
    31.  
    32. section '.code' code readable executable
    33.    start:
    34.         invoke  GetModuleHandle,NULL
    35.                 mov  [insH],eax
    36.         invoke  DialogBoxParam,eax,DLG_MAIN,NULL,dialog_procedure,NULL
    37.         invoke  ExitProcess,0
    38.  
    39.    proc dialog_procedure,hDlg,uMsg,wParam,lParam
    40.                 push ebx esi edi
    41.                 cmp  [uMsg],WMU_MOUSEHOOK
    42.                 je   wmuMOUSEHOOK
    43.                 cmp  [uMsg],WM_CLOSE
    44.                 je   wmCLOSE
    45.                 cmp  [uMsg],WM_INITDIALOG
    46.                 je   wmINITDIALOG
    47.                 cmp  [uMsg],WM_COMMAND
    48.                 je   wmCOMMAND
    49.                 jmp  wmBYE
    50.  
    51.         wmCLOSE:
    52.                         cmp  [hookFlag],TRUE
    53.                         jne  @f
    54.                 invoke  mouse_hook_uninstall
    55.                 @@:
    56.                 invoke  EndDialog,[hDlg],NULL
    57.                         jmp  wmBYE
    58.  
    59.         wmuMOUSEHOOK:
    60.                 invoke  GetDlgItemText,[hDlg],EDIT_HANDLE,buf2,128
    61.                 invoke  wsprintf,buf1,f1,[wParam]
    62.                 invoke  lstrcmpi,buf1,buf2
    63.                         cmp  eax,0
    64.                         je   @f
    65.                 invoke  SetDlgItemText,[hDlg],EDIT_HANDLE,buf1
    66.                 @@:
    67.                 invoke  GetDlgItemText,[hDlg],EDIT_CLSNAME,buf2,128
    68.                 invoke  GetClassName,[wParam],buf1,128
    69.                 invoke  lstrcmpi,buf1,buf2
    70.                         cmp  eax,0
    71.                         je   @f
    72.                 invoke  SetDlgItemText,[hDlg],EDIT_CLSNAME,buf1
    73.                 @@:
    74.                 invoke  GetDlgItemText,[hDlg],EDIT_WNDPROC,buf2,128
    75.                 invoke  GetClassLong,[wParam],GCL_WNDPROC
    76.                 invoke  wsprintf,buf1,f1,eax
    77.                 invoke  lstrcmpi,buf1,buf2
    78.                         cmp  eax,0
    79.                         je   @f
    80.                 invoke  SetDlgItemText,[hDlg],EDIT_WNDPROC,buf1
    81.                 @@:
    82.                         jmp  wmBYE
    83.         wmINITDIALOG:
    84.                 invoke  GetWindowRect,[hDlg],rect
    85.                 invoke  SetWindowPos,[hDlg],HWND_TOPMOST,[rect.left],[rect.top],[rect.right],[rect.bottom],SWP_SHOWWINDOW
    86.                         jmp  wmBYE
    87.  
    88.         wmCOMMAND:
    89.                         cmp  [lParam],0
    90.                         je   wmBYE
    91.                         mov  eax,[wParam]
    92.                         mov  edx,eax
    93.                         shr  edx,16
    94.                         cmp  dx,BN_CLICKED
    95.                         jne  wmBYE
    96.                         cmp  ax,BTN_EXIT
    97.                         je   wmCOMMAND_BTN_EXIT
    98.                         jmp  wmCOMMAND_BTN_HOOK
    99.  
    100.                 wmCOMMAND_BTN_EXIT:
    101.                         invoke  SendMessage,[hDlg],WM_CLOSE,0,0
    102.                                 jmp  wmBYE
    103.                
    104.                 wmCOMMAND_BTN_HOOK:
    105.                                 cmp  [hookFlag],TRUE
    106.                                 jne  BTN_HOOK_FALSE
    107.                         invoke  mouse_hook_uninstall
    108.                         invoke  SetDlgItemText,[hDlg],BTN_HOOK,txtHook
    109.                                 mov  [hookFlag],FALSE
    110.                         invoke  SetDlgItemText,[hDlg],EDIT_CLSNAME,NULL
    111.                         invoke  SetDlgItemText,[hDlg],EDIT_HANDLE,NULL
    112.                         invoke  SetDlgItemText,[hDlg],EDIT_WNDPROC,NULL
    113.                                 jmp  wmBYE
    114.  
    115.                         BTN_HOOK_FALSE:
    116.                                 invoke  mouse_hook_install,[hDlg]
    117.                                         cmp  eax,NULL
    118.                                         je   wmBYE
    119.                                         mov  [hookFlag],TRUE
    120.                                 invoke  SetDlgItemText,[hDlg],BTN_HOOK,txtUnhook
    121.                                         jmp  wmBYE
    122.                
    123.         wmBYE:
    124.                 pop  edi esi ebx
    125.                 return
    126.    endp
    127.  
    128. section '.idata' import data readable
    129.     library     KERNEL32, 'KERNEL32.DLL',\
    130.                 USER32,   'USER32.DLL',\
    131.                 TUT_24A,  'TUT_24A.DLL'
    132.    
    133.     import      KERNEL32,\
    134.                 GetModuleHandle,        'GetModuleHandleA',\
    135.                 lstrcmpi,               'lstrcmpiA',\
    136.                 ExitProcess,            'ExitProcess'
    137.     import      USER32,\
    138.                 RegisterClass,          'RegisterClassA',\
    139.                 CreateWindowEx,         'CreateWindowExA',\
    140.                 SendMessage,            'SendMessageA',\
    141.                 wsprintf,               'wsprintfA',\
    142.                 DialogBoxParam,         'DialogBoxParamA',\
    143.                 GetWindowRect,          'GetWindowRect',\
    144.                 GetClassName,           'GetClassNameA',\
    145.                 GetClassLong,           'GetClassLongA',\
    146.                 EndDialog,              'EndDialog',\
    147.                 GetDlgItemText,         'GetDlgItemTextA',\
    148.                 SetDlgItemText,         'SetDlgItemTextA',\
    149.                 SetWindowPos,           'SetWindowPos'
    150.    import       TUT_24A,\
    151.                 mouse_hook_install,     'mouse_hook_install',\
    152.                 mouse_hook_uninstall,   'mouse_hook_uninstall'
    153. section '.rsrc' resource data readable
    154.         directory       RT_DIALOG,appDialog
    155.        
    156.         resource        appDialog,\
    157.                         DLG_MAIN,LANG_NEUTRAL,dlgMain
    158.  
    159.         dialog dlgMain,'Mouse Hook Demo',0,0,229,85,\
    160.                 WS_CAPTION + WS_POPUP + WS_SYSMENU + DS_MODALFRAME
    161.                 dialogitem      'BUTTON','Window Information',-1,7,7,214,67,WS_VISIBLE + BS_GROUPBOX
    162.                 dialogitem      'STATIC','Class Name :',-1,21,22,42,8,SS_LEFT + WS_VISIBLE
    163.                 dialogitem      'EDIT','',EDIT_CLSNAME,69,20,139,12,ES_LEFT + ES_AUTOHSCROLL + ES_READONLY + WS_VISIBLE + WS_BORDER + WS_TABSTOP
    164.                 dialogitem      'STATIC','Handle :',-1,36,37,28,8,SS_LEFT + WS_VISIBLE
    165.                 dialogitem      'EDIT','',EDIT_HANDLE,69,36,76,12,ES_LEFT + ES_AUTOHSCROLL + ES_READONLY + WS_VISIBLE + WS_BORDER + WS_TABSTOP
    166.                 dialogitem      'STATIC','Window Proc :',-1,15,52,48,8,SS_LEFT + WS_VISIBLE
    167.                 dialogitem      'EDIT','',EDIT_WNDPROC,69,52,76,12,ES_LEFT + ES_AUTOHSCROLL + ES_READONLY + WS_VISIBLE + WS_BORDER + WS_TABSTOP
    168.                 dialogitem      'BUTTON','&Hook',BTN_HOOK,159,35,50,14,BS_DEFPUSHBUTTON + WS_VISIBLE + WS_TABSTOP
    169.                 dialogitem      'BUTTON','&Exit',BTN_EXIT,159,51,50,15,BS_PUSHBUTTON + WS_VISIBLE + WS_TABSTOP
    170.         enddialog
    171.  
    Результат
    [​IMG]
     

    Вложения:

    • tut_24.gif
      tut_24.gif
      Размер файла:
      3,5 КБ
      Просмотров:
      3.529
    rococo795 нравится это.
  9. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709

    Win32 API. Урок 25. Вывод картинки на экран

    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.         wndH            dd ?                    ;handle for window
    8.         insH            dd ?                    ;handle for instance
    9.         wndClsName      db 'TUT_25',0
    10.         wndTitle        db 'Tutorial 25',0
    11.  
    12.         wndCls  WNDCLASS
    13.         wndMsg  MSG
    14.        
    15.         bmp1H           dd ?                    ;handle for BMP file
    16.         bmp1Ps          PAINTSTRUCT
    17.         bmp1Rect        RECT
    18.         dcH             dd ?
    19.         dcMemH          dd ?
    20.        
    21.        
    22. section '.code' code readable executable
    23.    start:
    24.         invoke  GetModuleHandle,0
    25.                 mov  [insH],eax
    26.                 mov  [wndCls.hInstance],eax
    27.                 mov  [wndCls.style],CS_HREDRAW + CS_VREDRAW
    28.                 mov  [wndCls.lpfnWndProc],window_procedure
    29.                 mov  [wndCls.lpszClassName],wndClsName
    30.                 mov  [wndCls.hbrBackground],COLOR_WINDOW+1
    31.         invoke  LoadIcon,NULL,IDI_APPLICATION
    32.                 mov  [wndCls.hIcon],eax
    33.         invoke  LoadCursor,NULL,IDC_ARROW
    34.                 mov  [wndCls.hCursor],eax
    35.         invoke  RegisterClass,wndCls
    36.  
    37.         invoke  CreateWindowEx,\
    38.                 WS_EX_CLIENTEDGE,\
    39.                 wndClsName,\
    40.                 wndTitle,\
    41.                 WS_OVERLAPPEDWINDOW + WS_VISIBLE,\
    42.                 CW_USEDEFAULT,\
    43.                 CW_USEDEFAULT,\
    44.                 CW_USEDEFAULT,\
    45.                 CW_USEDEFAULT,\
    46.                 NULL,\
    47.                 NULL,\
    48.                 [insH],\
    49.                 NULL
    50.                 mov  [wndH],eax
    51.  
    52.    ;+---------------------------+
    53.    ;| entering the message loop |
    54.    ;+---------------------------+
    55.    window_message_loop_start:
    56.         invoke  GetMessage,wndMsg,NULL,0,0
    57.                 or    eax,eax
    58.                 je    window_message_loop_end
    59.         invoke  TranslateMessage,wndMsg
    60.         invoke  DispatchMessage,wndMsg
    61.                 jmp     window_message_loop_start
    62.  
    63.    window_message_loop_end:
    64.         invoke  ExitProcess,0
    65.  
    66.    ;+----------------------+
    67.    ;| the window procedure |
    68.    ;+----------------------+
    69.    proc window_procedure,hWnd,uMsg,wParam,lParam
    70.                 push ebx esi edi
    71.                 cmp  [uMsg],WM_CREATE
    72.                 je   wmCREATE
    73.                 cmp  [uMsg],WM_PAINT
    74.                 je   wmPAINT
    75.                 cmp  [uMsg],WM_DESTROY
    76.                 je   wmDESTROY
    77.        
    78.  
    79.         wmDEFAULT:
    80.                 invoke  DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    81.                         jmp  wmBYE
    82.  
    83.         wmCREATE:
    84.                 invoke  LoadBitmap,[insH],300
    85.                         mov  [bmp1H],eax
    86.                         jmp  wmBYE
    87.  
    88.         wmPAINT:
    89.                 invoke  BeginPaint,[hWnd],bmp1Ps
    90.                         mov  [dcH],eax
    91.                 invoke  CreateCompatibleDC,[dcH]
    92.                         mov  [dcMemH],eax
    93.                 invoke  SelectObject,[dcMemH],[bmp1H]
    94.                 invoke  GetClientRect,[hWnd],bmp1Rect
    95.                 invoke  BitBlt,[dcH],0,0,[bmp1Rect.right],[bmp1Rect.bottom],[dcMemH],0,0,SRCCOPY
    96.                 invoke  DeleteDC,[dcMemH]
    97.                 invoke  EndPaint,[hWnd],bmp1Ps
    98.                         jmp  wmBYE
    99.  
    100.         wmDESTROY:
    101.                 invoke  DeleteObject,[bmp1H]
    102.                 invoke  PostQuitMessage,0
    103.  
    104.         wmBYE:
    105.                 pop edi esi ebx
    106.                 return
    107.    endp
    108.  
    109. section '.idata' import data readable
    110.     library     KERNEL32, 'KERNEL32.DLL',\
    111.                 USER32,   'USER32.DLL',\
    112.                 GDI32,    'GDI32.DLL'
    113.    
    114.     import      KERNEL32,\
    115.                 GetModuleHandle,        'GetModuleHandleA',\
    116.                 FindResource,           'FindResourceA',\
    117.                 LoadResource,           'LoadResource',\
    118.                 LockResource,           'LockResource',\
    119.                 ExitProcess,            'ExitProcess'
    120.     import      USER32,\
    121.                 RegisterClass,          'RegisterClassA',\
    122.                 CreateWindowEx,         'CreateWindowExA',\
    123.                 DefWindowProc,          'DefWindowProcA',\
    124.                 LoadCursor,             'LoadCursorA',\
    125.                 LoadIcon,               'LoadIconA',\
    126.                 LoadBitmap,             'LoadBitmapA',\
    127.                 LoadMenu,               'LoadMenuA',\
    128.                 BeginPaint,             'BeginPaint',\
    129.                 EndPaint,               'EndPaint',\
    130.                 GetClientRect,          'GetClientRect',\
    131.                 MessageBox,             'MessageBoxA',\
    132.                 SendMessage,            'SendMessageA',\
    133.                 GetMessage,             'GetMessageA',\
    134.                 DestroyWindow,          'DestroyWindow',\
    135.                 TranslateMessage,       'TranslateMessage',\
    136.                 DispatchMessage,        'DispatchMessageA',\
    137.                 PostQuitMessage,        'PostQuitMessage'
    138.     import      GDI32,\
    139.                 CreateCompatibleDC,     'CreateCompatibleDC',\
    140.                 SelectObject,           'SelectObject',\
    141.                 BitBlt,                 'BitBlt',\
    142.                 DeleteDC,               'DeleteDC',\
    143.                 DeleteObject,           'DeleteObject'
    144.  
    145. section '.rsrc' resource data readable
    146.         directory       RT_BITMAP, appBmp
    147.        
    148.         resource        appBmp,\
    149.                         300,LANG_NEUTRAL,bmp1
    150.        
    151.         bitmap          bmp1, "tweety78.bmp"
    Результат
    [​IMG]
     

    Вложения:

    • tut_25.gif
      tut_25.gif
      Размер файла:
      12,3 КБ
      Просмотров:
      2.868
    rococo795 нравится это.
  10. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709

    Win32 API. Урок 26. Экран-заставка

    Код (ASM):
    1. format PE GUI 4.0 DLL
    2. entry DllMain
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.         insH            dd ?                    ;handle for instance
    8.         wndCls          WNDCLASS
    9.         wndClsName      db 'TUT_26A',0
    10.         wndMsg          MSG
    11.         wndH            dd ?
    12.  
    13.         bmpH            dd ?
    14.         bmpOldH         dd ?
    15.         bmp             BITMAP
    16.         bmp1Rect        RECT
    17.  
    18.         ps              PAINTSTRUCT
    19.         dcH             dd ?
    20.         dcMemH          dd ?
    21.  
    22.         dlgY            dd ?
    23.         dlgX            dd ?
    24.         dlgRect         RECT
    25.         desktopRect     RECT
    26.        
    27.         timerId         dd ?
    28.  
    29. section '.code' code readable executable
    30.    proc DllMain,hinstDll,fdwReason,lpvReserved
    31.         cmp  [fdwReason],DLL_PROCESS_ATTACH
    32.         jne  @f
    33.         push [hinstDll]
    34.         pop  [insH]
    35.         call show_bitmap
    36.         @@:
    37.         mov  eax,TRUE
    38.         return
    39.    endp
    40.  
    41.    proc show_bitmap
    42.                 push [insH]
    43.                 pop  [wndCls.hInstance]
    44.                 mov  [wndCls.style],CS_HREDRAW + CS_VREDRAW
    45.                 mov  [wndCls.lpfnWndProc],splash_procedure
    46.                 mov  [wndCls.lpszClassName],wndClsName
    47.                 mov  [wndCls.hbrBackground],COLOR_WINDOW + 1
    48.         invoke  LoadIcon,NULL,IDI_APPLICATION
    49.                 mov  [wndCls.hIcon],eax
    50.         invoke  LoadCursor,NULL,IDC_ARROW
    51.                 mov  [wndCls.hCursor],eax
    52.         invoke  RegisterClass,wndCls
    53.        
    54.         invoke  CreateWindowEx,NULL,wndClsName,NULL,\
    55.                 WS_POPUP + WS_VISIBLE,\
    56.                 CW_USEDEFAULT,CW_USEDEFAULT,600,371,\
    57.                 NULL,NULL,[insH],NULL
    58.                 mov  [wndH],eax
    59.  
    60.         ;+---------------------------+
    61.         ;| entering the message loop |
    62.         ;+---------------------------+
    63.         window_message_loop_start:
    64.                 invoke  GetMessage,wndMsg,NULL,0,0
    65.                         or    eax,eax
    66.                         je    window_message_loop_end
    67.                 invoke  TranslateMessage,wndMsg
    68.                 invoke  DispatchMessage,wndMsg
    69.                         jmp     window_message_loop_start
    70.  
    71.         window_message_loop_end:
    72.                 return
    73.    endp
    74.  
    75.    proc splash_procedure,hWnd,uMsg,wParam,lParam
    76.                 push ebx esi edi
    77.                 cmp  [uMsg],WM_CREATE
    78.                 je   wmCREATE
    79.                 cmp  [uMsg],WM_LBUTTONDOWN
    80.                 je   wmLBUTTONDOWN
    81.                 cmp  [uMsg],WM_PAINT
    82.                 je   wmPAINT
    83.                 cmp  [uMsg],WM_TIMER
    84.                 je   wmTIMER
    85.                 cmp  [uMsg],WM_DESTROY
    86.                 je   wmDESTROY
    87.        
    88.         wmDEFAULT:
    89.                 invoke  DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    90.                         jmp  wmBYE
    91.        
    92.         wmCREATE:
    93.                 invoke  GetWindowRect,[hWnd],dlgRect
    94.                 invoke  GetDesktopWindow
    95.                 invoke  GetWindowRect,eax,desktopRect
    96.                         push FALSE                      ;MoveWindow :: no repaint
    97.                        
    98.                         mov  eax,[dlgRect.bottom]
    99.                         sub  eax,[dlgRect.top]
    100.                         mov  [dlgY],eax
    101.                         push eax                        ;MoveWindow :: new height for window
    102.                        
    103.                         mov  eax,[dlgRect.right]
    104.                         sub  eax,[dlgRect.left]
    105.                         mov  [dlgX],eax
    106.                         push eax                        ;MoveWindow :: new width for window
    107.                        
    108.                         mov  eax,[desktopRect.bottom]
    109.                         sub  eax,[dlgY]
    110.                         shr  eax,1
    111.                         push eax                        ;MoveWindow :: new position of the top of the window
    112.                        
    113.                         mov  eax,[desktopRect.right]
    114.                         sub  eax,[dlgX]
    115.                         shr  eax,1
    116.                         push eax                        ;MoveWindow :: new position of the left side of the window
    117.                         push [hWnd]                     ;MoveWindow :: handle for window
    118.                         call [MoveWindow]
    119.                
    120.                 invoke  LoadBitmap,[insH],300
    121.                         mov  [bmpH],eax
    122.                
    123.                 invoke  SetTimer,[hWnd],1,2000,NULL
    124.                         mov  [timerId],eax
    125.                         jmp  wmBYE
    126.  
    127.         wmPAINT:
    128.                 invoke  BeginPaint,[hWnd],ps
    129.                         mov  [dcH],eax
    130.                 invoke  CreateCompatibleDC,eax
    131.                         mov  [dcMemH],eax
    132.                 invoke  SelectObject,eax,[bmpH]
    133.                         mov  [bmpOldH],eax
    134.                 invoke  GetObject,[bmpH],sizeof.BITMAP,bmp
    135.                 ;invoke BitBlt,[dcH],0,0,[bmp.bmWidth],[bmp.bmHeight],[dcMemH],0,0,SRCCOPY
    136.                         ;the usage of StretchBlt is here
    137.                         ;-------------------------------
    138.                         invoke  StretchBlt,[dcH],0,0,600,371,\
    139.                                 [dcMemH],0,0,[bmp.bmWidth],[bmp.bmHeight],SRCCOPY
    140.                 invoke  SelectObject,[dcMemH],[bmpOldH]
    141.                 invoke  DeleteObject,[dcMemH]
    142.                 invoke  EndPaint,[hWnd],ps
    143.                         jmp  wmBYE
    144.  
    145.         wmLBUTTONDOWN:
    146.                 invoke  DestroyWindow,[hWnd]
    147.                         jmp  wmBYE
    148.  
    149.         wmTIMER:
    150.                 invoke  SendMessage,[hWnd],WM_LBUTTONDOWN,NULL,NULL
    151.                 invoke  KillTimer,[hWnd],[timerId]
    152.                         jmp  wmBYE
    153.        
    154.         wmDESTROY:
    155.                         cmp  [bmpH],NULL
    156.                         je   @f
    157.                 invoke  DeleteObject,[bmpH]
    158.                 @@:
    159.                 invoke  PostQuitMessage,NULL
    160.                         jmp  wmBYE
    161.        
    162.         wmBYE:
    163.                 pop  edi esi ebx
    164.                 return
    165.    endp
    166.  
    167. section '.idata' import data readable
    168.         library KERNEL32, 'KERNEL32.DLL',\
    169.                 USER32,   'USER32.DLL',\
    170.                 GDI32,    'GDI32.DLL'
    171.  
    172.     import      KERNEL32,\
    173.                 GetModuleHandle,        'GetModuleHandleA',\
    174.                 ExitProcess,            'ExitProcess'
    175.     import      USER32,\
    176.                 RegisterClass,          'RegisterClassA',\
    177.                 RegisterClassEx,        'RegisterClassExA',\
    178.                 CreateWindowEx,         'CreateWindowExA',\
    179.                 DefWindowProc,          'DefWindowProcA',\
    180.                 LoadCursor,             'LoadCursorA',\
    181.                 LoadIcon,               'LoadIconA',\
    182.                 LoadBitmap,             'LoadBitmapA',\
    183.                 LoadMenu,               'LoadMenuA',\
    184.                 BeginPaint,             'BeginPaint',\
    185.                 EndPaint,               'EndPaint',\
    186.                 GetWindowRect,          'GetWindowRect',\
    187.                 GetDesktopWindow,       'GetDesktopWindow',\
    188.                 MoveWindow,             'MoveWindow',\
    189.                 SetTimer,               'SetTimer',\
    190.                 KillTimer,              'KillTimer',\
    191.                 ShowWindow,             'ShowWindow',\
    192.                 MessageBox,             'MessageBoxA',\
    193.                 SendMessage,            'SendMessageA',\
    194.                 GetMessage,             'GetMessageA',\
    195.                 DestroyWindow,          'DestroyWindow',\
    196.                 TranslateMessage,       'TranslateMessage',\
    197.                 DispatchMessage,        'DispatchMessageA',\
    198.                 PostQuitMessage,        'PostQuitMessage'
    199.     import      GDI32,\
    200.                 CreateCompatibleDC,     'CreateCompatibleDC',\
    201.                 SelectObject,           'SelectObject',\
    202.                 GetObject,              'GetObjectA',\
    203.                 GetCurrentObject,       'GetCurrentObject',\
    204.                 StretchBlt,             'StretchBlt',\
    205.                 BitBlt,                 'BitBlt',\
    206.                 DeleteDC,               'DeleteDC',\
    207.                 DeleteObject,           'DeleteObject'
    208.  
    209. section '.edata' export data readable
    210.         export  'TUT_24A.DLL',\
    211.                 show_bitmap,            'show_bitmap',\
    212.                 splash_procedure,       'splash_procedure'
    213.  
    214. section '.reloc' fixups data discardable
    215.  
    216. section '.rsrc' resource data readable
    217.         directory       RT_BITMAP, appBmp
    218.        
    219.         resource        appBmp,\
    220.                         300,LANG_NEUTRAL,bmp1
    221.        
    222.         bitmap          bmp1, "splash.bmp"
    223.  
    224.  
    225.  
    226. code for tut_26b.asm
    227. format PE GUI 4.0
    228. entry start
    229.  
    230. include '%fasminc%\win32a.inc'
    231.  
    232. section '.data' data readable writeable
    233.         wndH            dd ?
    234.         insH            dd ?
    235.         wndClsName      db 'TUT_26B',0
    236.         wndTitle        db 'Tutorial 26B',0
    237.  
    238.         wndCls  WNDCLASS
    239.         wndMsg  MSG
    240.        
    241.         libName         db 'TUT_26A.DLL',0
    242.        
    243. section '.code' code readable executable
    244.    start:
    245.         invoke  LoadLibrary,libName
    246.                 cmp  eax,NULL
    247.                 je   @f
    248.         invoke  FreeLibrary,eax
    249.         @@:
    250.         invoke  GetModuleHandle,0
    251.                 mov  [insH],eax
    252.                 mov  [wndCls.hInstance],eax
    253.                 mov  [wndCls.style],CS_HREDRAW or CS_VREDRAW
    254.                 mov  [wndCls.lpfnWndProc],window_procedure
    255.                 mov  [wndCls.lpszClassName],wndClsName
    256.                 mov  [wndCls.hbrBackground],COLOR_BTNFACE+1
    257.         invoke  LoadIcon,NULL,IDI_APPLICATION
    258.                 mov  [wndCls.hIcon],eax
    259.         invoke  LoadCursor,NULL,IDC_ARROW
    260.                 mov  [wndCls.hCursor],eax
    261.         invoke  RegisterClass,wndCls
    262.  
    263.         invoke  CreateWindowEx,0,\
    264.                 wndClsName,wndTitle,\
    265.                 WS_OVERLAPPEDWINDOW + WS_VISIBLE,\
    266.                 CW_USEDEFAULT,CW_USEDEFAULT,400,240,\
    267.                 NULL,NULL,[insH],NULL
    268.                 mov  [wndH],eax
    269.         invoke  ShowWindow,eax,SW_MAXIMIZE
    Продолжение ниже
     

    Вложения:

    • tut_26.jpg
      tut_26.jpg
      Размер файла:
      19,9 КБ
      Просмотров:
      2.854
    rococo795 нравится это.
  11. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Код (ASM):
    1.    ;+---------------------------+
    2.    ;| entering the message loop |
    3.    ;+---------------------------+
    4.    window_message_loop_start:
    5.         invoke  GetMessage,wndMsg,NULL,0,0
    6.                 or    eax,eax
    7.                 je    window_message_loop_end
    8.         invoke  TranslateMessage,wndMsg
    9.         invoke  DispatchMessage,wndMsg
    10.                 jmp     window_message_loop_start
    11.  
    12.    window_message_loop_end:
    13.         invoke  ExitProcess,0
    14.        
    15.    ;+----------------------+
    16.    ;| the window procedure |
    17.    ;+----------------------+
    18.    proc window_procedure,hWnd,uMsg,wParam,lParam
    19.                 push ebx esi edi
    20.                 cmp  [uMsg],WM_DESTROY
    21.                 je   wmDESTROY
    22.        
    23.  
    24.         wmDEFAULT:
    25.                 invoke  DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    26.                         jmp  wmBYE
    27.  
    28.         wmDESTROY:
    29.                 invoke  PostQuitMessage,0
    30.  
    31.         wmBYE:
    32.                 pop edi esi ebx
    33.                 return
    34.    endp
    35.  
    36. section '.idata' import data readable
    37.     library     KERNEL32, 'KERNEL32.DLL',\
    38.                 USER32,   'USER32.DLL'
    39.    
    40.     import      KERNEL32,\
    41.                 GetModuleHandle,        'GetModuleHandleA',\
    42.                 LoadLibrary,            'LoadLibraryA',\
    43.                 FreeLibrary,            'FreeLibrary',\
    44.                 ExitProcess,            'ExitProcess'
    45.     import      USER32,\
    46.                 RegisterClass,          'RegisterClassA',\
    47.                 CreateWindowEx,         'CreateWindowExA',\
    48.                 DefWindowProc,          'DefWindowProcA',\
    49.                 LoadCursor,             'LoadCursorA',\
    50.                 LoadIcon,               'LoadIconA',\
    51.                 SendMessage,            'SendMessageA',\
    52.                 GetMessage,             'GetMessageA',\
    53.                 MessageBox,             'MessageBoxA',\
    54.                 ShowWindow,             'ShowWindow',\
    55.                 DestroyWindow,          'DestroyWindow',\
    56.                 TranslateMessage,       'TranslateMessage',\
    57.                 DispatchMessage,        'DispatchMessageA',\
    58.                 PostQuitMessage,        'PostQuitMessage'
    Результат
    [​IMG]
     
    Последнее редактирование: 12 дек 2016
    rococo795 нравится это.
  12. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709

    Win32 API. Урок 27. Тултип-контрол

    Код (ASM):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.         wndH            dd ?
    8.         insH            dd ?
    9.         wndClsName      db 'TUT_27',0
    10.         wndTitle        db 'Tutorial 27',0
    11.  
    12.         wndCls  WNDCLASS
    13.         wndMsg  MSG
    14.        
    15.         tipsH           dd ?
    16.        
    17.         ctlClsNameTips  db 'Tooltips_class32',0
    18.        
    19.         tipsTxt1        db 'This is the upper left area of the dialog',0
    20.         tipsTxt2        db 'This is the upper right area of the dialog',0
    21.         tipsTxt3        db 'This is the lower left area of the dialog',0
    22.         tipsTxt4        db 'This is the lower right area of the dialog',0
    23.  
    24.         ti      TOOLINFO
    25.         id      dd ?
    26.         rect    RECT
    27.         buffer  rb 0xFF
    28.        
    29. section '.code' code readable executable
    30.    start:
    31.         invoke  GetModuleHandle,0
    32.                 mov  [insH],eax
    33.         invoke  DialogBoxParam,eax,101,NULL,dialog_procedure,NULL
    34.         invoke  ExitProcess,0
    35.  
    36.    proc dialog_procedure,hDlg,uMsg,wParam,lParam
    37.                 push ebx esi edi
    38.                 cmp  [uMsg],WM_INITDIALOG
    39.                 je   wmINITDIALOG
    40.                 cmp  [uMsg],WM_CLOSE
    41.                 je   wmCLOSE
    42.                 pop  edi esi ebx
    43.                 mov  eax,FALSE
    44.                 return
    45.        
    46.         wmCLOSE:
    47.                 invoke  EndDialog,[hDlg],NULL
    48.                         jmp  wmBYE
    49.  
    50.         wmINITDIALOG:
    51.                 invoke  InitCommonControls
    52.                 invoke  CreateWindowEx,NULL,ctlClsNameTips,NULL,\
    53.                         TTS_ALWAYSTIP,\
    54.                         CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,\
    55.                         NULL,NULL,[insH],NULL
    56.                         mov  [tipsH],eax
    57.                         mov  [id],0
    58.                         mov  [ti.cbSize],sizeof.TOOLINFO
    59.                         mov  [ti.uFlags],TTF_SUBCLASS
    60.                         push [hDlg]
    61.                         pop  [ti.hwnd]
    62.                 invoke  GetWindowRect,[hDlg],rect
    63.                 stdcall SetDlgToolArea,[hDlg],ti,tipsTxt1,[id],rect
    64.                         inc  [id]
    65.                 stdcall SetDlgToolArea,[hDlg],ti,tipsTxt2,[id],rect
    66.                         inc  [id]
    67.                 stdcall SetDlgToolArea,[hDlg],ti,tipsTxt3,[id],rect
    68.                         inc  [id]
    69.                 stdcall SetDlgToolArea,[hDlg],ti,tipsTxt4,[id],rect
    70.                 invoke  EnumChildWindows,[hDlg],EnumChild,ti
    71.                         jmp  wmBYE
    72.         wmBYE:
    73.                 pop  edi esi ebx
    74.                 mov  eax,TRUE
    75.                 return
    76.    endp
    77.    proc EnumChild,hwnd,lParam
    78.                 push edi
    79.                 mov  edi,[lParam]
    80.                 push [hwnd]
    81.                 pop  [edi + TOOLINFO.uId]
    82.                 or   [edi + TOOLINFO.uFlags],TTF_IDISHWND
    83.         invoke  GetWindowText,[hwnd],buffer,0xFF
    84.                 mov  [edi + TOOLINFO.lpszText],buffer
    85.         invoke  SendMessage,[tipsH],TTM_ADDTOOL,NULL,edi
    86.                 pop  edi
    87.                 return
    88.    endp
    89.  
    90.    proc SetDlgToolArea,hDlg,lpti,lpText,id,lprect
    91.         push edi esi
    92.         mov  edi,[lpti]
    93.         mov  esi,[lprect]
    94.         cmp  [id],0
    95.         je   id_0
    96.         cmp  [id],1
    97.         je   id_1
    98.         cmp  [id],2
    99.         je   id_2
    100.         cmp  [id],3
    101.         je   id_3
    102.         jmp  id_exit
    103.        
    104.         id_0:
    105.                 mov  [edi + TOOLINFO.rect.left],0
    106.                 mov  [edi + TOOLINFO.rect.top],0
    107.                 mov  eax,[esi + RECT.right]
    108.                 sub  eax,[esi + RECT.left]
    109.                 shr  eax,1
    110.                 mov  [edi + TOOLINFO.rect.right],eax
    111.                 mov  eax,[esi + RECT.bottom]
    112.                 sub  eax,[esi + RECT.top]
    113.                 shr  eax,1
    114.                 mov  [edi + TOOLINFO.rect.bottom],eax
    115.                 jmp  id_exit
    116.         id_1:
    117.                 mov  eax,[esi + RECT.right]
    118.                 sub  eax,[esi + RECT.left]
    119.                 shr  eax,1
    120.                 inc  eax
    121.                 mov  [edi + TOOLINFO.rect.left],eax
    122.                 mov  [edi + TOOLINFO.rect.top],0
    123.                 mov  eax,[esi + RECT.right]
    124.                 sub  eax,[esi + RECT.left]
    125.                 mov  [edi + TOOLINFO.rect.right],eax
    126.                 mov  eax,[esi + RECT.bottom]
    127.                 sub  eax,[esi + RECT.top]
    128.                 mov  [edi + TOOLINFO.rect.bottom],eax
    129.                 jmp  id_exit
    130.         id_2:
    131.                 mov  [edi + TOOLINFO.rect.left],0
    132.                 mov  eax,[esi + RECT.bottom]
    133.                 sub  eax,[esi + RECT.top]
    134.                 shr  eax,1
    135.                 inc  eax
    136.                 mov  [edi + TOOLINFO.rect.top],eax
    137.                 mov  eax,[esi + RECT.right]
    138.                 sub  eax,[esi + RECT.left]
    139.                 shr  eax,1
    140.                 mov  [edi + TOOLINFO.rect.right],eax
    141.                 mov  eax,[esi + RECT.bottom]
    142.                 sub  eax,[esi + RECT.top]
    143.                 mov  [edi + TOOLINFO.rect.bottom],eax
    144.                 jmp  id_exit
    145.         id_3:
    146.                 mov  eax,[esi + RECT.right]
    147.                 sub  eax,[esi + RECT.left]
    148.                 shr  eax,1
    149.                 inc  eax
    150.                 mov  [edi + TOOLINFO.rect.left],eax
    151.                 mov  eax,[esi + RECT.bottom]
    152.                 sub  eax,[esi + RECT.top]
    153.                 shr  eax,1
    154.                 inc  eax
    155.                 mov  [edi + TOOLINFO.rect.top],eax
    156.                 mov  eax,[esi + RECT.right]
    157.                 sub  eax,[esi + RECT.left]
    158.                 mov  [edi + TOOLINFO.rect.right],eax
    159.                 mov  eax,[esi + RECT.bottom]
    160.                 sub  eax,[esi + RECT.top]
    161.                 mov  [edi + TOOLINFO.rect.bottom],eax
    162.                 jmp  id_exit
    163.         id_exit:
    164.                         push [lpText]
    165.                         pop  [edi + TOOLINFO.lpszText]
    166.                 invoke  SendMessage,[tipsH],TTM_ADDTOOL,NULL,[lpti]
    167.                         pop  esi edi
    168.                         return
    169.    endp
    170.  
    171. section '.idata' import data readable
    172.     library     KERNEL32, 'KERNEL32.DLL',\
    173.                 USER32,   'USER32.DLL',\
    174.                 COMCTL32, 'COMCTL32.DLL'
    175.    
    176.     import      KERNEL32,\
    177.                 GetModuleHandle,        'GetModuleHandleA',\
    178.                 ExitProcess,            'ExitProcess'
    179.     import      USER32,\
    180.                 RegisterClass,          'RegisterClassA',\
    181.                 CreateWindowEx,         'CreateWindowExA',\
    182.                 DialogBoxParam,         'DialogBoxParamA',\
    183.                 EndDialog,              'EndDialog',\
    184.                 GetWindowRect,          'GetWindowRect',\
    185.                 EnumChildWindows,       'EnumChildWindows',\
    186.                 GetWindowText,          'GetWindowTextA',\
    187.                 SendMessage,            'SendMessageA'
    188.     import      COMCTL32,\
    189.                 InitCommonControls,     'InitCommonControls'
    190.  
    191. section '.rsrc' resource data readable
    192.         directory       RT_DIALOG,appDialog
    193.        
    194.         resource        appDialog,\
    195.                         101,LANG_NEUTRAL,dlgMain
    196.  
    197.         dialog dlgMain,'Tooltip Example',0,0,229,96,\
    198.                 WS_CAPTION + WS_POPUP + WS_SYSMENU + DS_MODALFRAME
    199.                 dialogitem      'BUTTON','&Ok',1000,55,68,50,14,BS_PUSHBUTTON + WS_VISIBLE + WS_TABSTOP
    200.                 dialogitem      'BUTTON','&Exit',1001,123,68,50,14,BS_PUSHBUTTON + WS_VISIBLE + WS_TABSTOP
    201.         enddialog
    Результат
    [​IMG]
     

    Вложения:

    • tut_27.gif
      tut_27.gif
      Размер файла:
      3,6 КБ
      Просмотров:
      2.831
    rococo795 нравится это.
  13. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709

    Win32 API. Урок 28. Debug API часть первая

    Код (ASM):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. struct EXCEPTION_RECORD
    7.         .ExceptionCode          dd ?
    8.         .ExceptionFlags         dd ?
    9.         .ExceptionRecord        dd ?
    10.         .ExceptionAddress       dd ?
    11.         .NumberParameters       dd ?
    12.         .ExceptionInformation   rd 15
    13. ends
    14.  
    15. struct EXCEPTION_DEBUG_INFO
    16.         .ExceptionRecord        EXCEPTION_RECORD
    17.         .dwFirstChance          dd ?
    18. ends
    19.  
    20. struct CREATE_PROCESS_DEBUG_INFO
    21.         .hFile                  dd ?
    22.         .hProcess               dd ?
    23.         .hThread                dd ?
    24.         .lpBaseOfImage          dd ?
    25.         .dwDebugInfoFileOffset  dd ?
    26.         .nDebugInfoSize         dd ?
    27.         .lpThreadLocalBase      dd ?
    28.         .lpStartAddress         dd ?
    29.         .lpImageName            dd ?
    30.         .fUnicode               dw ?
    31. ends
    32.  
    33. struct EXIT_PROCESS_DEBUG_INFO
    34.         .dwExitCode             dd ?
    35. ends
    36.  
    37. struct DEBUG_EVENT
    38.         .dwDebugEventCode       dd ?
    39.         .dwProcessId            dd ?
    40.         .dwThreadId             dd ?
    41.         .u                      rd 22
    42. ends
    43.  
    44. INFINITE                        = 0xFFFFFFFF
    45. DBG_EXCEPTION_NOT_HANDLED       = 0x80010001
    46. DBG_CONTINUE                    = 0x00010002
    47. DBG_TERMINATE_THREAD            = 0x40010003
    48. DBG_TERMINATE_PROCESS           = 0x40010004
    49. EXIT_PROCESS_DEBUG_EVENT        = 0x00000005
    50. CREATE_PROCESS_DEBUG_EVENT      = 0x00000003
    51. EXCEPTION_DEBUG_EVENT           = 0x00000001
    52. CREATE_THREAD_DEBUG_EVENT       = 0x00000002
    53. EXIT_THREAD_DEBUG_EVENT         = 0x00000004
    54. EXCEPTION_BREAKPOINT            = 0x80000003
    55.  
    56. WMU_DBGSTART                    = WM_USER + 20
    57. WMU_DBGEND                      = WM_USER + 22
    58.  
    59. section '.data' data readable writeable
    60.         insH            dd ?
    61.      
    62.         ofn             OPENFILENAME
    63.         ofnTxtFilter    db 'Executable Files',0,'*.exe',0
    64.                         db 'All Files',0,'*.*',0,0
    65.         ofnBuffer       rb 512
    66.      
    67.         proStartInfo    STARTUPINFO
    68.         proInfo         PROCESS_INFORMATION
    69.         proExitCode     dd ?
    70.      
    71.         dbgEvent        DEBUG_EVENT
    72.         dbgId           dd ?
    73.         dbgThreadH      dd ?
    74.         dbgThreadStatus dd ?
    75.      
    76.         fBuffer         rb 0xFF
    77.         f1              db '0x%lX',0
    78.         f2              db '%s',0
    79.      
    80.         timerId         dd ?
    81.      
    82.         dbgMsg1         db 'EXCEPTION_DEBUG_EVENT',0
    83.         dbgMsg2         db 'CREATE_THREAD_DEBUG_EVENT',0
    84.         dbgMsg3         db 'CREATE_PROCESS_DEBUG_EVENT',0
    85.         dbgMsg4         db 'EXIT_THREAD_DEBUG_EVENT',0
    86.         dbgMsg5         db 'EXIT_PROCESS_DEBUG_EVENT',0
    87.         dbgMsg6         db 'LOAD_DLL_DEBUG_EVENT',0
    88.         dbgMsg7         db 'UNLOAD_DLL_DEBUG_EVENT',0
    89.         dbgMsg8         db 'OUTPUT_DEBUG_STRING_EVENT',0
    90.         dbgMsg9         db 'RIP_EVENT',0
    91.         dbgMsgError     db 'ERROR : INVALID DEBUG EVENT',0
    92.         dbgMsgExit      db 'BYE BYE',0
    93.         dbgMsgBreak     db 'EXCEPTION_BREAKPOINT',0
    94.      
    95. section '.code' code readable executable
    96.    start:
    97.         invoke  GetModuleHandle,0
    98.                 mov  [insH],0
    99.         invoke  DialogBoxParam,eax,100,NULL,dialog_procedure,NULL
    100.         invoke  ExitProcess,0
    101.  
    102.    proc dialog_procedure,hDlg,uMsg,wParam,lParam
    103.         push ebx esi edi
    104.  
    105.         cmp  [uMsg],WM_COMMAND
    106.         je   wmCOMMAND
    107.         cmp  [uMsg],WM_CLOSE
    108.         je   wmCLOSE
    109.         cmp  [uMsg],WM_TIMER
    110.         je   wmTIMER
    111.         cmp  [uMsg],WM_INITDIALOG
    112.         je   wmINITDIALOG
    113.         cmp  [uMsg],WMU_DBGSTART
    114.         je   wmuDBGSTART
    115.         cmp  [uMsg],WMU_DBGEND
    116.         je   wmuDBGEND
    117.  
    118.         pop  edi esi ebx
    119.         mov  eax,FALSE
    120.         return
    121.      
    122.         wmCLOSE:
    123.                 invoke  EndDialog,[hDlg],NULL
    124.                         jmp  wmBYE
    125.  
    126.         wmTIMER:
    127.                 invoke  KillTimer,[hDlg],[timerId]
    128.                 invoke  ResumeThread,[dbgThreadH]
    129.                         jmp  wmBYE
    130.         wmuDBGSTART:
    131.                 invoke  CreateThread,NULL,0,debug_thread_procedure,[hDlg],NORMAL_PRIORITY_CLASS,dbgId
    132.                         mov  [dbgThreadH],eax
    133.                         jmp  wmBYE
    134.  
    135.         wmuDBGEND:
    136.                 invoke  CloseHandle,[dbgThreadH]
    137.                         jmp  wmBYE
    138.      
    139.         wmCOMMAND:
    140.  
    141.                         cmp  [wParam],0xFFFF and 300                    ;Button :: Browse
    142.                         je   wmCOMMAND_300
    143.                         jmp  wmBYE
    144.              
    145.                 wmCOMMAND_300:
    146.                         invoke  GetOpenFileName,ofn
    147.                                 cmp  eax,TRUE
    148.                                 jne  wmBYE
    149.                         invoke  GetDlgItem,[hDlg],100
    150.                         invoke  SetWindowText,eax,ofnBuffer
    151.                         invoke  SendMessage,[hDlg],WMU_DBGSTART,NULL,NULL
    152.                                 jmp  wmBYE
    153.              
    154.         wmINITDIALOG:
    155.                 mov  [ofn.lStructSize],sizeof.OPENFILENAME
    156.                 mov  [ofn.lpstrFilter],ofnTxtFilter
    157.                 mov  [ofn.lpstrFile],ofnBuffer
    158.                 mov  [ofn.nMaxFile],512
    159.                 mov  [ofn.Flags],OFN_FILEMUSTEXIST + OFN_PATHMUSTEXIST + OFN_LONGNAMES +\
    160.                      OFN_EXPLORER + OFN_HIDEREADONLY
    161.                 jmp  wmBYE
    162.  
    163.         wmBYE:
    164.                 pop  edi esi ebx
    165.                 mov  eax,TRUE
    166.                 return
    167.    endp
    168.  
    169.    proc debug_thread_procedure,hDlg
    170.         invoke  GetStartupInfo,proStartInfo
    171.         invoke  CreateProcess,ofnBuffer,NULL,NULL,NULL,FALSE,\
    172.                 NORMAL_PRIORITY_CLASS + DEBUG_PROCESS + DEBUG_ONLY_THIS_PROCESS,NULL,NULL,proStartInfo,proInfo
    173.  
    174.         _300_debug_loop:
    175.                 invoke  WaitForDebugEvent,dbgEvent,INFINITE
    176.                      
    177.                         mov  edx,[dbgEvent.dwDebugEventCode]
    178.                      
    179.                         mov  eax,dbgMsg1        ;EXCEPTION_DEBUG_EVENT
    180.                         cmp  edx,1
    181.                         je   loop_continue
    182.                      
    183.                         mov  eax,dbgMsg2        ;CREATE_THREAD_DEBUG_EVENT
    184.                         cmp  edx,2
    185.                         je   loop_continue
    186.                      
    187.                         mov  eax,dbgMsg3        ;CREATE_PROCESS_DEBUG_EVENT
    188.                         cmp  edx,3
    189.                         je   loop_continue
    190.                      
    191.                         mov  eax,dbgMsg4        ;EXIT_THREAD_DEBUG_EVENT
    192.                         cmp  edx,4
    193.                         je   loop_continue
    194.              
    195.                         mov  eax,dbgMsg5        ;EXIT_PROCESS_DEBUG_EVENT
    196.                         cmp  edx,5
    197.                         je   loop_continue
    198.  
    199.                         mov  eax,dbgMsg6        ;LOAD_DLL_DEBUG_EVENT
    200.                         cmp  edx,6
    201.                         je   loop_continue
    202.  
    203.                         mov  eax,dbgMsg7        ;UNLOAD_DLL_DEBUG_EVENT
    204.                         cmp  edx,7
    205.                         je   loop_continue
    206.  
    207.                         mov  eax,dbgMsg8        ;OUTPUT_DEBUG_STRING_EVENT
    208.                         cmp  edx,8
    209.                         je   loop_continue
    210.  
    211.                         mov  eax,dbgMsg9        ;RIP_EVENT
    212.                         cmp  edx,9
    213.                         je   loop_continue
    214.                      
    215.                         mov  eax,dbgMsgError
    Продолжение следует
     

    Вложения:

    • tut_28.gif
      tut_28.gif
      Размер файла:
      4,2 КБ
      Просмотров:
      2.783
    Последнее редактирование: 17 дек 2016
    rococo795 нравится это.
  14. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Код (ASM):
    1.                loop_continue:
    2.                         stdcall debug_set_window_message,[hDlg],eax
    3.                         invoke  SetTimer,[hDlg],1,2000,NULL
    4.                                 mov  [timerId],eax
    5.                         invoke  SuspendThread,[dbgThreadH]
    6.                
    7.                         ;EXIT_PROCESS_DEBUG_EVENT
    8.                         cmp  [dbgEvent.dwDebugEventCode],EXIT_PROCESS_DEBUG_EVENT
    9.                         je   _300_debug_exit
    10.                        
    11.                         ;EXCEPTION_DEBUG_EVENT
    12.                         cmp  [dbgEvent.dwDebugEventCode],EXCEPTION_DEBUG_EVENT
    13.                         jne  @f
    14.                                 ;EXCEPTION_BREAKPOINT
    15.                                 cmp  [dbgEvent.u + EXCEPTION_DEBUG_INFO.ExceptionRecord.ExceptionCode],EXCEPTION_BREAKPOINT
    16.                                 jne  @f
    17.                                 stdcall debug_set_window_message,[hDlg],dbgMsgBreak
    18.                                 invoke  SetTimer,[hDlg],1,2000,NULL
    19.                                         mov  [timerId],eax
    20.                                 invoke  SuspendThread,[dbgThreadH]
    21.                         invoke  ContinueDebugEvent,[dbgEvent.dwProcessId],[dbgEvent.dwThreadId],DBG_CONTINUE
    22.                                 jmp  _300_debug_loop
    23.                
    24.                 @@:     ;CREATE_PROCESS_DEBUG_EVENT
    25.                         cmp  [dbgEvent.dwDebugEventCode],CREATE_PROCESS_DEBUG_EVENT
    26.                         jne  @f
    27.                 stdcall debug_set_window_info,[hDlg],[dbgEvent.u + CREATE_PROCESS_DEBUG_INFO.hFile],101
    28.                 stdcall debug_set_window_info,[hDlg],[dbgEvent.u + CREATE_PROCESS_DEBUG_INFO.hProcess],102
    29.                 stdcall debug_set_window_info,[hDlg],[dbgEvent.u + CREATE_PROCESS_DEBUG_INFO.hThread],103
    30.                 stdcall debug_set_window_info,[hDlg],[dbgEvent.u + CREATE_PROCESS_DEBUG_INFO.lpBaseOfImage],104
    31.                 stdcall debug_set_window_info,[hDlg],[dbgEvent.u + CREATE_PROCESS_DEBUG_INFO.lpStartAddress],105
    32.                         jmp  _300_debug_continue
    33.                
    34.                 @@:
    35.  
    36.         _300_debug_continue:
    37.                 invoke  ContinueDebugEvent,[dbgEvent.dwProcessId],[dbgEvent.dwThreadId],DBG_EXCEPTION_NOT_HANDLED
    38.                         jmp  _300_debug_loop
    39.        
    40.         _300_debug_exit:
    41.                 stdcall debug_set_window_message,[hDlg],dbgMsgExit
    42.                
    43.                 invoke  ContinueDebugEvent,[dbgEvent.dwProcessId],[dbgEvent.dwThreadId],DBG_TERMINATE_THREAD
    44.                 invoke  ContinueDebugEvent,[dbgEvent.dwProcessId],[dbgEvent.dwThreadId],DBG_TERMINATE_PROCESS
    45.                 invoke  CloseHandle,[proInfo.hProcess]
    46.                 invoke  CloseHandle,[proInfo.hThread]
    47.                 invoke  SendMessage,[hDlg],WMU_DBGEND,NULL,NULL
    48.                         return
    49.    endp
    50.    
    51.    proc debug_set_window_info,hDlg,debugInfo,dlgItemNum
    52.         invoke  wsprintf,fBuffer,f1,[debugInfo]
    53.         invoke  GetDlgItem,[hDlg],[dlgItemNum]
    54.         invoke  SetWindowText,eax,fBuffer
    55.                 return
    56.    endp
    57.  
    58.    proc debug_set_window_message,hDlg,dbgMsg
    59.         invoke  wsprintf,fBuffer,f2,[dbgMsg]
    60.         invoke  GetDlgItem,[hDlg],106
    61.         invoke  SetWindowText,eax,fBuffer
    62.                 return
    63.    endp
    64.  
    65. section '.idata' import data readable
    66.     library     KERNEL32, 'KERNEL32.DLL',\
    67.                 USER32,   'USER32.DLL',\
    68.                 COMDLG32, 'COMDLG32.DLL'
    69.    
    70.     import      KERNEL32,\
    71.                 GetModuleHandle,        'GetModuleHandleA',\
    72.                 GetStartupInfo,         'GetStartupInfoA',\
    73.                 CreateProcess,          'CreateProcessA',\
    74.                 CloseHandle,            'CloseHandle',\
    75.                 ContinueDebugEvent,     'ContinueDebugEvent',\
    76.                 WaitForDebugEvent,      'WaitForDebugEvent',\
    77.                 GetExitCodeProcess,     'GetExitCodeProcess',\
    78.                 TerminateProcess,       'TerminateProcess',\
    79.                 TerminateThread,        'TerminateThread',\
    80.                 CreateThread,           'CreateThread',\
    81.                 GetExitCodeThread,      'GetExitCodeThread',\
    82.                 SuspendThread,          'SuspendThread',\
    83.                 ResumeThread,           'ResumeThread',\
    84.                 ExitThread,             'ExitThread',\
    85.                 ExitProcess,            'ExitProcess'
    86.     import      USER32,\
    87.                 RegisterClass,          'RegisterClassA',\
    88.                 CreateWindowEx,         'CreateWindowExA',\
    89.                 SendMessage,            'SendMessageA',\
    90.                 GetMessage,             'GetMessageA',\
    91.                 MessageBox,             'MessageBoxA',\
    92.                 DialogBoxParam,         'DialogBoxParamA',\
    93.                 SetWindowText,          'SetWindowTextA',\
    94.                 wsprintf,               'wsprintfA',\
    95.                 GetDlgItem ,            'GetDlgItem',\
    96.                 SetTimer,               'SetTimer',\
    97.                 KillTimer,              'KillTimer',\
    98.                 EndDialog,              'EndDialog'
    99.     import      COMDLG32,\
    100.                 GetOpenFileName,        'GetOpenFileNameA'
    101.  
    102. section '.rsrc' resource data readable
    103.         directory       RT_DIALOG,appDialog
    104.        
    105.         resource        appDialog,\
    106.                         100,LANG_NEUTRAL,dlgMain
    107.  
    108.         dialog dlgMain,'Simple Debugger',0,0,300,100,\
    109.                 DS_MODALFRAME + WS_POPUP + WS_CAPTION + WS_SYSMENU,\
    110.                 ,,'Tahoma',8
    111.                 dialogitem      'STATIC','File :',-1,8,8,17,10,SS_LEFT + WS_VISIBLE
    112.                 dialogitem      'BUTTON','Browse',300,242,5,50,15,BS_PUSHBUTTON + WS_VISIBLE + WS_TABSTOP
    113.                 dialogitem      'STATIC','',100,27,7,206,11,SS_RIGHT + SS_SUNKEN + SS_PATHELLIPSIS + WS_VISIBLE
    114.                 dialogitem      'BUTTON',' Handle Information ',-1,8,23,120,58,BS_GROUPBOX + WS_VISIBLE
    115.                 dialogitem      'STATIC','',101,72,37,51,11,SS_RIGHT + SS_SUNKEN + WS_VISIBLE + WS_GROUP
    116.                 dialogitem      'STATIC','',102,72,51,51,11,SS_RIGHT + SS_SUNKEN + WS_VISIBLE + WS_GROUP
    117.                 dialogitem      'STATIC','',103,72,65,51,11,SS_RIGHT + SS_SUNKEN + WS_VISIBLE + WS_GROUP
    118.                 dialogitem      'STATIC','File Handle :',-1,15,38,41,7,SS_LEFT + WS_VISIBLE + WS_GROUP
    119.                 dialogitem      'STATIC','Process Handle :',-1,15,52,54,7,SS_LEFT + WS_VISIBLE + WS_GROUP
    120.                 dialogitem      'STATIC','Thread Handle :',-1,15,66,51,7,SS_LEFT + WS_VISIBLE + WS_GROUP
    121.                 dialogitem      'STATIC','Image Base :',-1,133,29,42,8,SS_LEFT + WS_VISIBLE + WS_GROUP
    122.                 dialogitem      'STATIC','Start Address :',-1,133,44,49,7,SS_LEFT + WS_VISIBLE + WS_GROUP
    123.                 dialogitem      'STATIC','',104,188,28,103,11,SS_RIGHT + SS_SUNKEN + WS_VISIBLE
    124.                 dialogitem      'STATIC','',105,188,43,103,11,SS_RIGHT + SS_SUNKEN + WS_VISIBLE
    125.                 dialogitem      'STATIC','Debugger Message :',-1,8,87,66,8,SS_LEFT + WS_VISIBLE
    126.                 dialogitem      'STATIC','',106,79,86,215,11,SS_LEFT + SS_SUNKEN + WS_VISIBLE
    127.         enddialog
    128.  
    Результат
    [​IMG]
     
    rococo795 нравится это.
  15. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709

    Win32 API. Урок 31. Контрол Listview

    Текст tut_31a.asm
    Код (ASM):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. M_MAIN        = 10000
    5. MI_ICON        = 0x0000
    6. MI_SMALLICON    = 0x0002
    7. MI_LIST        = 0x0003
    8. MI_REPORT    = 0x0001
    9.  
    10. include '%fasminc%\win32a.inc'
    11.  
    12. macro RGB cR, cG, cB {
    13.     xor    eax,eax    ;clear the eax
    14.     mov    ah,cB
    15.     shl    eax,8
    16.     mov    ah,cG
    17.     mov    al,cR
    18. }
    19.  
    20. section '.data' data readable writeable
    21.     wndH        dd ?
    22.     insH        dd ?
    23.     wndClsName    db 'TUT_31',0
    24.     wndTitle    db 'Tutorial 31',0
    25.  
    26.     wndCls    WNDCLASS
    27.     wndMsg    MSG
    28.  
    29.     ctlClsNameLv    db 'SysListView32',0
    30.  
    31.     lvH        dd ?
    32.     lvTxt1        db 'File Name',0
    33.     lvTxt2        db 'Size',0
    34.     lvTxt3        db '%lu',0
    35.     lvSortSize    dd 0
    36.     lvSortFile    dd 0
    37.  
    38.     menuH        dd ?
    39.  
    40.     lvI1a    db 'Durian',0
    41.     lvI1b    db '34',0
    42.     lvI2a    db 'Banana',0
    43.     lvI2b    db '54',0
    44.     lvI3a    db 'Watermelon',0
    45.     lvI3b    db '44',0
    46.     lvI4a    db 'Apple',0
    47.     lvI4b    db '55',0
    48.     lvI5a    db 'Papaya',0
    49.     lvI5b    db '1',0
    50.  
    51. section '.code' code readable executable
    52. start:
    53.     invoke    GetModuleHandle,0
    54.         mov  [insH],eax
    55.         mov  [wndCls.hInstance],eax
    56.         mov  [wndCls.style],CS_HREDRAW or CS_VREDRAW
    57.         mov  [wndCls.lpfnWndProc],window_procedure
    58.         mov  [wndCls.lpszClassName],wndClsName
    59.         mov  [wndCls.lpszMenuName],10000
    60.         mov  [wndCls.hbrBackground],COLOR_BTNFACE+1
    61.     invoke    LoadIcon,NULL,IDI_APPLICATION
    62.         mov  [wndCls.hIcon],eax
    63.     invoke    LoadCursor,NULL,IDC_ARROW
    64.         mov  [wndCls.hCursor],eax
    65.     invoke    RegisterClass,wndCls
    66.  
    67.     invoke    CreateWindowEx,WS_EX_CLIENTEDGE,\
    68.         wndClsName,wndTitle,\
    69.         WS_OVERLAPPEDWINDOW + WS_VISIBLE,\
    70.         CW_USEDEFAULT,CW_USEDEFAULT,400,240,\
    71.         NULL,NULL,[insH],NULL
    72.         mov  [wndH],eax
    73.  
    74.     invoke    InitCommonControls
    75.  
    76. ;+---------------------------+
    77. ;| entering the message loop |
    78. ;+---------------------------+
    79. window_message_loop_start:
    80.     invoke    GetMessage,wndMsg,NULL,0,0
    81.         or    eax,eax
    82.         je    window_message_loop_end
    83.     invoke    TranslateMessage,wndMsg
    84.     invoke    DispatchMessage,wndMsg
    85.         jmp    window_message_loop_start
    86.  
    87. window_message_loop_end:
    88.     invoke    ExitProcess,0
    89.  
    90. ;+----------------------+
    91. ;| the window procedure |
    92. ;+----------------------+
    93. proc window_procedure,hWnd,uMsg,wParam,lParam
    94.         push ebx esi edi
    95.         cmp  [uMsg],WM_NOTIFY
    96.         je   wmNOTIFY
    97.         cmp  [uMsg],WM_CREATE
    98.         je   wmCREATE
    99.         cmp  [uMsg],WM_SIZE
    100.         je   wmSIZE
    101.         cmp  [uMsg],WM_DESTROY
    102.         je   wmDESTROY
    103.  
    104.     wmDEFAULT:
    105.         invoke    DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    106.             jmp  wmBYE
    107.  
    108.     wmNOTIFY:
    109.             mov  ebx,[lParam]
    110.             mov  eax,[ebx + NMHDR.hwndFrom]
    111.             cmp  eax,[lvH]
    112.             jne  wmDEFAULT
    113.  
    114.             cmp  [ebx + NMHDR.code],LVN_COLUMNCLICK
    115.             je   wmNOTIFY_LVN_COLUMNCLICK
    116.             cmp  [ebx + NMHDR.code],NM_DBLCLK
    117.             je   wmNOTIFY_NM_DBLCLK
    118.             jmp  wmDEFAULT
    119.  
    120.         wmNOTIFY_LVN_COLUMNCLICK:
    121.             cmp  [ebx + NMLISTVIEW.iSubItem],1
    122.             je   COLUMNCLICK_SIZE
    123.             jmp  COLUMNCLICK_FILE
    124.  
    125.             COLUMNCLICK_SIZE:
    126.                     cmp  [lvSortSize],1
    127.                     je   SIZE_1
    128.  
    129.                 SIZE_0:
    130.                     mov  [lvSortSize],1
    131.                     jmp  @f
    132.  
    133.                 SIZE_1:
    134.                     mov  [lvSortSize],2
    135.  
    136.             @@:
    137.                 invoke    SendMessage,[lvH],LVM_SORTITEMS,[lvSortSize],lv_compare
    138.                 call    lv_param_update
    139.                     jmp  wmBYE
    140.  
    141.             COLUMNCLICK_FILE:
    142.                     cmp  [lvSortFile],3
    143.                     je   FILE_4
    144.  
    145.                 FILE_3:
    146.                     mov  [lvSortFile],3
    147.                     jmp  @f
    148.  
    149.                 FILE_4:
    150.                     mov  [lvSortFile],4
    151.             @@:
    152.                 invoke    SendMessage,[lvH],LVM_SORTITEMS,[lvSortFile],lv_compare
    153.                 call    lv_param_update
    154.                     jmp  wmBYE
    155.        
    156.         wmNOTIFY_NM_DBLCLK:
    157.             invoke    MessageBox,NULL,wndClsName,wndClsName,MB_OK
    158.                 jmp  wmBYE        
    159.  
    160.  
    161.     wmSIZE:
    162.             mov  eax,[lParam]
    163.             mov  edx,eax
    164.             and  eax,0xFFFF
    165.             shr  edx,16
    166.         invoke    MoveWindow,[lvH],0,0,eax,edx,TRUE
    167.             jmp  wmBYE
    168.  
    169.     wmCREATE:
    170.         invoke    CreateWindowEx,NULL,ctlClsNameLv,NULL,\
    171.             LVS_REPORT + WS_CHILD + WS_VISIBLE,\
    172.             0,0,0,0,\
    173.             [hWnd],NULL,[insH],NULL
    174.             mov  [lvH],eax
    175.         call    lv_col_insert
    176.         call    lv_col_info_fill
    177.         invoke    GetMenu,[hWnd]
    178.             mov  [menuH],eax
    179.         invoke    CheckMenuRadioItem,eax,MI_ICON,MI_REPORT,MI_REPORT,MF_CHECKED
    180.             jmp  wmBYE
    181.  
    182.     wmDESTROY:
    183.         invoke    PostQuitMessage,0
    184.  
    185.     wmBYE:
    186.         pop edi esi ebx
    187.         return
    188.    endp
    189.  
    190. proc lv_param_update
    191.     lvi1    LVITEM
    192.     enter
    193.         invoke    SendMessage,[lvH],LVM_GETITEMCOUNT,0,0
    194.             mov  ebx,eax
    195.             mov  [lvi1.mask],LVIF_PARAM
    196.             mov  [lvi1.iSubItem],0
    197.             mov  [lvi1.iItem],0
    198.     @@:
    199.             cmp  ebx,0
    200.             je   @f
    201.             push [lvi1.iItem]
    202.             pop  [lvi1.lParam]
    203.             lea  eax,[lvi1]
    204.         invoke    SendMessage,[lvH],LVM_SETITEM,0,eax
    205.             inc  [lvi1.iItem]
    206.             dec  ebx
    207.             jmp  @b
    208.     @@:
    209.         return
    210. endp
    211.  
    212. proc convert_strhval,str
    213.     result    dd ?
    214.     enter
    215.         push ecx edi edx esi
    216.         mov  [result],0
    217.         mov  edi,[str]
    218.     invoke    lstrlen,[str]
    219.  
    220.     a:
    221.         cmp  eax,0
    222.         je   b
    223.         xor  edx,edx
    224.         mov  dl,[edi]
    225.         sub  dl,'0'
    226.         mov  esi,eax
    227.         dec  esi
    228.         push eax
    229.         mov  eax,edx
    230.         push ebx
    231.         mov  ebx,10
    232.     @@:
    233.         cmp  esi,0
    234.         je   @f
    235.         mul  ebx
    236.         dec  esi
    237.         jmp  @b
    238.     @@:
    239.         pop  ebx
    240.         add  [result],eax
    241.         pop  eax
    242.         inc  edi
    243.         dec  eax
    244.         jmp  a
    245.     b:
    246.         pop  esi edx edi ecx
    247.         mov  eax,[result]
    248.         return
    249. endp
    250.  
    251. proc lv_compare,lParam1,lParam2,lParamSort
    252.     buf1    rb 0xFF
    253.     buf2    rb 0xFF
    254.     lvi0    LVITEM
    255.     enter
    256.         mov  [lvi0.mask],LVIF_TEXT
    257.         lea  eax,[buf1]
    258.         mov  [lvi0.pszText],eax
    259.         mov  [lvi0.cchTextMax],0xFF
    260.  
    261.         cmp  [lParamSort],2
    262.         jbe  compare_1
    263.         jmp  compare_3
    264.         return
    265.  
    266.     compare_1:
    267.             push edi
    268.             mov  [lvi0.iSubItem],1
    269.             lea  eax,[lvi0]
    270.         invoke    SendMessage,[lvH],LVM_GETITEMTEXT,[lParam1],eax
    271.             lea  eax,[buf1]
    272.         stdcall    convert_strhval,eax
    273.             mov  edi,eax
    274.             lea  eax,[lvi0]
    275.         invoke    SendMessage,[lvH],LVM_GETITEMTEXT,[lParam2],eax
    276.             lea  eax,[buf1]
    277.         stdcall    convert_strhval,eax
    278.             cmp  [lParamSort],1
    279.             jne  @f
    280.             sub  edi,eax
    281.             mov  eax,edi
    282.             jmp  compare_1_exit
    283.         @@:
    284.             sub  eax,edi
    285.  
    286.         compare_1_exit:
    287.                 pop  edi
    288.                 return
    289.  
    290.     compare_3:
    291.             mov  [lvi0.iSubItem],0
    292.             lea  eax,[lvi0]
    293.         invoke    SendMessage,[lvH],LVM_GETITEMTEXT,[lParam1],eax
    294.             lea  edx,[buf2]        ;destination
    295.             lea  eax,[buf1]        ;source
    296.         invoke    lstrcpy,edx,eax
    297.             lea  eax,[lvi0]
    298.         invoke    SendMessage,[lvH],LVM_GETITEMTEXT,[lParam2],eax
    299.             lea  edx,[buf2]
    300.             lea  eax,[buf1]
    301.             cmp  [lParamSort],3
    302.             jne  @f
    303.         invoke    lstrcmpi,edx,eax
    304.             return
    305.         @@:
    306.         invoke    lstrcmpi,eax,edx
    307.             return
    308.  
    309. endp
    310.  
    311. proc lv_col_insert
    312.     lvCol    LVCOLUMN
    313.     enter
    314.         mov  [lvCol.mask],LVCF_TEXT + LVCF_WIDTH
    315.         mov  [lvCol.pszText],lvTxt1
    316.         mov  [lvCol.cx],150
    317.         lea  edx,[lvCol]
    318.         push edx
    319.     invoke    SendMessage,[lvH],LVM_INSERTCOLUMN,0,edx
    320.         mov  [lvCol.pszText],lvTxt2
    321.         mov  [lvCol.cx],100
    322.     invoke    SendMessage,[lvH],LVM_INSERTCOLUMN,1
    323.         return
    324. endp
    325.  
    326. proc lv_col_info_fill
    327.     lvItem    LVITEM
    328.     enter
    329.         push lvI5b
    330.         push lvI5a
    331.         push lvI4b
    332.         push lvI4a
    333.         push lvI3b
    334.         push lvI3a
    335.         push lvI2b
    336.         push lvI2a
    337.         push lvI1b
    338.         push lvI1a
    339.         mov  ebx,0
    340.    
    341.     @@:
    342.         mov  [lvItem.mask],LVIF_TEXT + LVIF_PARAM
    343.         pop  [lvItem.pszText]
    344.         mov  [lvItem.iSubItem],0
    345.         mov  [lvItem.iItem],ebx
    346.         mov  [lvItem.lParam],ebx
    347.         lea  eax,[lvItem]
    348.     invoke    SendMessage,[lvH],LVM_INSERTITEM,0,eax
    349.         mov  [lvItem.mask],LVIF_TEXT
    350.         inc  [lvItem.iSubItem]
    351.         pop  [lvItem.pszText]
    352.         lea  eax,[lvItem]
    353.     invoke    SendMessage,[lvH],LVM_SETITEM,0,eax
    354.         inc  ebx
    355.         cmp  ebx,5
    356.         jb   @b
    357.         return
    358. endp
    359.  
    360. section '.idata' import data readable
    361.     library    kernel32, 'KERNEL32.DLL',\
    362.         user32,   'USER32.DLL',\
    363.         comctl32, 'COMCTL32.DLL'
    364.  
    365.     include '%fasminc%\apia\Kernel32.inc'
    366.     include '%fasminc%\apia\User32.inc'
    367.     include '%fasminc%\apia\Comctl32.inc'
    368.  
    369. section '.rsrc' resource from 'tut_31.rc.res'

    Результат


    [​IMG]
    Продолжение ниже
     

    Вложения:

    • tut_31a.gif
      tut_31a.gif
      Размер файла:
      2,5 КБ
      Просмотров:
      2.653
    Последнее редактирование: 12 дек 2016
    rococo795 нравится это.
  16. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Текст tut_31b.asm
    Код (ASM):
    1.  
    2. format PE GUI 4.0
    3. entry start
    4.  
    5. M_MAIN        = 10000
    6. MI_ICON        = 0x0000
    7. MI_SMALLICON    = 0x0002
    8. MI_LIST        = 0x0003
    9. MI_REPORT    = 0x0001
    10.  
    11. include '%fasminc%\win32a.inc'
    12.  
    13. macro RGB cR, cG, cB {
    14.     xor    eax,eax    ;clear the eax
    15.     mov    ah,cB
    16.     shl    eax,8
    17.     mov    ah,cG
    18.     mov    al,cR
    19. }
    20.  
    21. struct WIN32_FIND_DATA
    22.     .dwFileAttributes    dd ?
    23.     .ftCreationTime        dq ?
    24.     .ftLastAccessTime    dq ?
    25.     .ftLastWriteTime    dq ?
    26.     .nFileSizeHigh        dd ?
    27.     .nFileSizeLow        dd ?
    28.     .dwReserved0        dd ?
    29.     .dwReserved1        dd ?
    30.     .cFileName        rb 260
    31.     .cAlternateFileName    rb 14
    32. ends
    33.  
    34. section '.data' data readable writeable
    35.     wndH        dd ?
    36.     insH        dd ?
    37.     wndClsName    db 'TUT_31',0
    38.     wndTitle    db 'Tutorial 31',0
    39.  
    40.     wndCls    WNDCLASS
    41.     wndMsg    MSG
    42.  
    43.     ctlClsNameLv    db 'SysListView32',0
    44.  
    45.     lvH        dd ?
    46.     lvTxt1        db 'File Name',0
    47.     lvTxt2        db 'Size',0
    48.     lvTxt3        db '%lu',0
    49.     lvSortSize    dd 0
    50.     lvSortFile    dd 0
    51.  
    52.     menuH        dd ?
    53.  
    54.     fFileH        dd ?
    55.     fData        WIN32_FIND_DATA
    56.     fTxt1        db '*.*',0
    57. section '.code' code readable executable
    58. start:
    59.     invoke    GetModuleHandle,0
    60.         mov  [insH],eax
    61.         mov  [wndCls.hInstance],eax
    62.         mov  [wndCls.style],CS_HREDRAW or CS_VREDRAW
    63.         mov  [wndCls.lpfnWndProc],window_procedure
    64.         mov  [wndCls.lpszClassName],wndClsName
    65.         mov  [wndCls.lpszMenuName],10000
    66.         mov  [wndCls.hbrBackground],COLOR_BTNFACE+1
    67.     invoke    LoadIcon,NULL,IDI_APPLICATION
    68.         mov  [wndCls.hIcon],eax
    69.     invoke    LoadCursor,NULL,IDC_ARROW
    70.         mov  [wndCls.hCursor],eax
    71.     invoke    RegisterClass,wndCls
    72.  
    73.     invoke    CreateWindowEx,WS_EX_CLIENTEDGE,\
    74.         wndClsName,wndTitle,\
    75.         WS_OVERLAPPEDWINDOW + WS_VISIBLE,\
    76.         CW_USEDEFAULT,CW_USEDEFAULT,400,240,\
    77.         NULL,NULL,[insH],NULL
    78.         mov  [wndH],eax
    79.  
    80.     invoke    InitCommonControls
    81.  
    82. ;+---------------------------+
    83. ;| entering the message loop |
    84. ;+---------------------------+
    85. window_message_loop_start:
    86.     invoke    GetMessage,wndMsg,NULL,0,0
    87.         or    eax,eax
    88.         je    window_message_loop_end
    89.     invoke    TranslateMessage,wndMsg
    90.     invoke    DispatchMessage,wndMsg
    91.         jmp    window_message_loop_start
    92.  
    93. window_message_loop_end:
    94.     invoke    ExitProcess,0
    95.  
    96. ;+----------------------+
    97. ;| the window procedure |
    98. ;+----------------------+
    99. proc window_procedure,hWnd,uMsg,wParam,lParam
    100.         push ebx esi edi
    101.         cmp  [uMsg],WM_COMMAND
    102.         je   wmCOMMAND
    103.         cmp  [uMsg],WM_NOTIFY
    104.         je   wmNOTIFY
    105.         cmp  [uMsg],WM_CREATE
    106.         je   wmCREATE
    107.         cmp  [uMsg],WM_SIZE
    108.         je   wmSIZE
    109.         cmp  [uMsg],WM_DESTROY
    110.         je   wmDESTROY
    111.  
    112.     wmDEFAULT:
    113.         invoke    DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    114.             jmp  wmBYE
    115.  
    116.     wmCOMMAND:
    117.             cmp  [lParam],0
    118.             jne  wmBYE
    119.         invoke    GetWindowLong,[lvH],GWL_STYLE
    120.             and  eax,not LVS_TYPEMASK
    121.             mov  edx,[wParam]
    122.             and  edx,0xFFFF
    123.             push edx
    124.             or   eax,edx
    125.         invoke    SetWindowLong,[lvH],GWL_STYLE,eax
    126.             pop  edx
    127.         invoke    CheckMenuRadioItem,[menuH],MI_ICON,MI_LIST,edx,MF_CHECKED
    128.             jmp  wmBYE
    129.  
    130.     wmNOTIFY:
    131.             mov  ebx,[lParam]
    132.             mov  eax,[ebx + NMHDR.hwndFrom]
    133.             cmp  eax,[lvH]
    134.             jne  wmDEFAULT
    135.  
    136.             cmp  [ebx + NMHDR.code],LVN_COLUMNCLICK
    137.             je   wmNOTIFY_LVN_COLUMNCLICK
    138.             cmp  [ebx + NMHDR.code],NM_DBLCLK
    139.             je   wmNOTIFY_NM_DBLCLK
    140.             jmp  wmDEFAULT
    141.  
    142.         wmNOTIFY_LVN_COLUMNCLICK:
    143.             cmp  [ebx + NMLISTVIEW.iSubItem],1
    144.             je   COLUMNCLICK_SIZE
    145.             jmp  COLUMNCLICK_FILE
    146.  
    147.             COLUMNCLICK_SIZE:
    148.                     cmp  [lvSortSize],1
    149.                     je   SIZE_1
    150.  
    151.                 SIZE_0:
    152.                     mov  [lvSortSize],1
    153.                     jmp  @f
    154.  
    155.                 SIZE_1:
    156.                     mov  [lvSortSize],2
    157.  
    158.             @@:
    159.                 invoke    SendMessage,[lvH],LVM_SORTITEMS,[lvSortSize],lv_compare
    160.                 call    lv_param_update
    161.                     jmp  wmBYE
    162.  
    163.             COLUMNCLICK_FILE:
    164.                     cmp  [lvSortFile],3
    165.                     je   FILE_4
    166.  
    167.                 FILE_3:
    168.                     mov  [lvSortFile],3
    169.                     jmp  @f
    170.  
    171.                 FILE_4:
    172.                     mov  [lvSortFile],4
    173.             @@:
    174.                 invoke    SendMessage,[lvH],LVM_SORTITEMS,[lvSortFile],lv_compare
    175.                 call    lv_param_update
    176.                     jmp  wmBYE
    177.            
    178.         wmNOTIFY_NM_DBLCLK:
    179.             call    lv_item_focus
    180.                 jmp  wmBYE          
    181.  
    182.    
    183.     wmSIZE:
    184.             mov  eax,[lParam]
    185.             mov  edx,eax
    186.             and  eax,0xFFFF
    187.             shr  edx,16
    188.         invoke    MoveWindow,[lvH],0,0,eax,edx,TRUE
    189.             jmp  wmBYE
    190.  
    191.     wmCREATE:
    192.         invoke    CreateWindowEx,NULL,ctlClsNameLv,NULL,\
    193.             LVS_REPORT + WS_CHILD + WS_VISIBLE,\
    194.             0,0,0,0,\
    195.             [hWnd],NULL,[insH],NULL
    196.             mov  [lvH],eax
    197.         call    lv_col_insert
    198.         call    lv_col_info_fill
    199.             RGB 0xAF,0xB5,0xC9
    200.         invoke    SendMessage,[lvH],LVM_SETTEXTCOLOR,0,eax
    201.             RGB 0x2E,0x35,0x50
    202.         invoke    SendMessage,[lvH],LVM_SETBKCOLOR,0,eax
    203.             RGB 0x2E,0x35,0x50
    204.         invoke    SendMessage,[lvH],LVM_SETTEXTBKCOLOR,0,eax
    205.         invoke    GetMenu,[hWnd]
    206.             mov  [menuH],eax
    207.         invoke    CheckMenuRadioItem,eax,MI_ICON,MI_LIST,MI_REPORT,MF_CHECKED
    208.             jmp  wmBYE
    209.  
    210.     wmDESTROY:
    211.         invoke    PostQuitMessage,0
    212.  
    213.     wmBYE:
    214.         pop edi esi ebx
    215.         return
    216.    endp
    217.  
    218. proc lv_item_focus
    219.     lvi4    LVITEM
    220.     buf4    rb 0xFF
    221.     enter
    222.  
    223.     invoke    SendMessage,[lvH],LVM_GETNEXTITEM,-1,LVNI_FOCUSED
    224.         mov  [lvi4.iItem],eax
    225.         mov  [lvi4.iSubItem],0
    226.         mov  [lvi4.mask],LVIF_TEXT
    227.         lea  eax,[buf4]
    228.         mov  [lvi4.pszText],eax
    229.         mov  [lvi4.cchTextMax],0xFF
    230.         lea  eax,[lvi4]
    231.     invoke    SendMessage,[lvH],LVM_GETITEM,0,eax
    232.         lea  eax,[buf4]
    233.     invoke    MessageBox,NULL,eax,wndTitle,MB_OK
    234.     return
    235. endp
    236.  
    237. proc lv_param_update
    238.     lvi1    LVITEM
    239.     enter
    240.         invoke    SendMessage,[lvH],LVM_GETITEMCOUNT,0,0
    241.             mov  ebx,eax
    242.             mov  [lvi1.mask],LVIF_PARAM
    243.             mov  [lvi1.iSubItem],0
    244.             mov  [lvi1.iItem],0
    245.     @@:
    246.             cmp  ebx,0
    247.             je   @f
    248.             push [lvi1.iItem]
    249.             pop  [lvi1.lParam]
    250.             lea  eax,[lvi1]
    251.         invoke    SendMessage,[lvH],LVM_SETITEM,0,eax
    252.             inc  [lvi1.iItem]
    253.             dec  ebx
    254.             jmp  @b
    255.     @@:
    256.         return
    257. endp
    258.  
    259. proc convert_strhval,str
    260.     result    dd ?
    261.     enter
    262.         push ecx edi edx esi
    263.         mov  [result],0
    264.         mov  edi,[str]
    265.     invoke    lstrlen,[str]
    266.  
    267.     a:
    268.         cmp  eax,0
    269.         je   b
    270.         xor  edx,edx
    271.         mov  dl,[edi]
    272.         sub  dl,'0'
    273.         mov  esi,eax
    274.         dec  esi
    275.         push eax
    276.         mov  eax,edx
    277.         push ebx
    278.         mov  ebx,10
    279.     @@:
    280.         cmp  esi,0
    281.         je   @f
    282.         mul  ebx
    283.         dec  esi
    284.         jmp  @b
    285.     @@:
    286.         pop  ebx
    287.         add  [result],eax
    288.         pop  eax
    289.         inc  edi
    290.         dec  eax
    291.         jmp  a
    292.     b:
    293.         pop  esi edx edi ecx
    294.         mov  eax,[result]
    295.         return
    296. endp
    297.  
    298. proc lv_compare,lParam1,lParam2,lParamSort
    299.     buf1    rb 0xFF
    300.     buf2    rb 0xFF
    301.     lvi0    LVITEM
    302.     enter
    303.         mov  [lvi0.mask],LVIF_TEXT
    304.         lea  eax,[buf1]
    305.         mov  [lvi0.pszText],eax
    306.         mov  [lvi0.cchTextMax],0xFF
    307.  
    308.         cmp  [lParamSort],2
    309.         jbe  compare_1
    310.         jmp  compare_3
    311.         return
    312.  
    313.     compare_1:
    314.             push edi
    315.             mov  [lvi0.iSubItem],1
    316.             lea  eax,[lvi0]
    317.         invoke    SendMessage,[lvH],LVM_GETITEMTEXT,[lParam1],eax
    318.             lea  eax,[buf1]
    319.         stdcall    convert_strhval,eax
    320.             mov  edi,eax
    321.             lea  eax,[lvi0]
    322.         invoke    SendMessage,[lvH],LVM_GETITEMTEXT,[lParam2],eax
    323.             lea  eax,[buf1]
    324.         stdcall    convert_strhval,eax
    325.             cmp  [lParamSort],1
    326.             jne  @f
    327.             sub  edi,eax
    328.             mov  eax,edi
    329.             jmp  compare_1_exit
    330.         @@:
    331.             sub  eax,edi
    332.  
    333.         compare_1_exit:
    334.                 pop  edi
    335.                 return
    336.  
    337.     compare_3:
    338.             mov  [lvi0.iSubItem],0
    339.             lea  eax,[lvi0]
    340.         invoke    SendMessage,[lvH],LVM_GETITEMTEXT,[lParam1],eax
    341.             lea  edx,[buf2]        ;destination
    342.             lea  eax,[buf1]        ;source
    343.         invoke    lstrcpy,edx,eax
    344.             lea  eax,[lvi0]
    345.         invoke    SendMessage,[lvH],LVM_GETITEMTEXT,[lParam2],eax
    346.             lea  edx,[buf2]
    347.             lea  eax,[buf1]
    348.             cmp  [lParamSort],3
    349.             jne  @f
    350.         invoke    lstrcmpi,edx,eax
    351.             return
    352.         @@:
    353.         invoke    lstrcmpi,eax,edx
    354.             return
    355.  
    356. endp
    357.  
    358. proc lv_col_insert
    359.     lvCol    LVCOLUMN
    360.     enter
    361.         mov  [lvCol.mask],LVCF_TEXT + LVCF_WIDTH
    362.         mov  [lvCol.pszText],lvTxt1
    363.         mov  [lvCol.cx],150
    364.         lea  edx,[lvCol]
    365.         push edx
    366.     invoke    SendMessage,[lvH],LVM_INSERTCOLUMN,0,edx
    367.         or   [lvCol.mask],LVCF_FMT
    368.         mov  [lvCol.fmt],LVCFMT_RIGHT
    369.         mov  [lvCol.pszText],lvTxt2
    370.         mov  [lvCol.cx],100
    371.     invoke    SendMessage,[lvH],LVM_INSERTCOLUMN,1
    372.         return
    373. endp
    374.  
    375. proc lv_col_info_fill
    376.         push edi
    377.     invoke    FindFirstFile,fTxt1,fData
    378.         cmp  eax,INVALID_HANDLE_VALUE
    379.         je   fill_exit
    380.         mov  [fFileH],eax
    381.         xor  edi,edi    
    382.    
    Продолжение ниже
     

    Вложения:

    • tut_31b.gif
      tut_31b.gif
      Размер файла:
      4,7 КБ
      Просмотров:
      1.061
    rococo795 нравится это.
  17. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Текст tut_31b.asm
    Код (ASM):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. M_MAIN        = 10000
    5. MI_ICON        = 0x0000
    6. MI_SMALLICON    = 0x0002
    7. MI_LIST        = 0x0003
    8. MI_REPORT    = 0x0001
    9.  
    10. include '%fasminc%\win32a.inc'
    11.  
    12. macro RGB cR, cG, cB {
    13.     xor    eax,eax    ;clear the eax
    14.     mov    ah,cB
    15.     shl    eax,8
    16.     mov    ah,cG
    17.     mov    al,cR
    18. }
    19.  
    20. struct WIN32_FIND_DATA
    21.     .dwFileAttributes    dd ?
    22.     .ftCreationTime        dq ?
    23.     .ftLastAccessTime    dq ?
    24.     .ftLastWriteTime    dq ?
    25.     .nFileSizeHigh        dd ?
    26.     .nFileSizeLow        dd ?
    27.     .dwReserved0        dd ?
    28.     .dwReserved1        dd ?
    29.     .cFileName        rb 260
    30.     .cAlternateFileName    rb 14
    31. ends
    32.  
    33. section '.data' data readable writeable
    34.     wndH        dd ?
    35.     insH        dd ?
    36.     wndClsName    db 'TUT_31',0
    37.     wndTitle    db 'Tutorial 31',0
    38.  
    39.     wndCls    WNDCLASS
    40.     wndMsg    MSG
    41.  
    42.     ctlClsNameLv    db 'SysListView32',0
    43.  
    44.     lvH        dd ?
    45.     lvTxt1        db 'File Name',0
    46.     lvTxt2        db 'Size',0
    47.     lvTxt3        db '%lu',0
    48.     lvSortSize    dd 0
    49.     lvSortFile    dd 0
    50.  
    51.     menuH        dd ?
    52.  
    53.     fFileH        dd ?
    54.     fData        WIN32_FIND_DATA
    55.     fTxt1        db '*.*',0
    56. section '.code' code readable executable
    57. start:
    58.     invoke    GetModuleHandle,0
    59.         mov  [insH],eax
    60.         mov  [wndCls.hInstance],eax
    61.         mov  [wndCls.style],CS_HREDRAW or CS_VREDRAW
    62.         mov  [wndCls.lpfnWndProc],window_procedure
    63.         mov  [wndCls.lpszClassName],wndClsName
    64.         mov  [wndCls.lpszMenuName],10000
    65.         mov  [wndCls.hbrBackground],COLOR_BTNFACE+1
    66.     invoke    LoadIcon,NULL,IDI_APPLICATION
    67.         mov  [wndCls.hIcon],eax
    68.     invoke    LoadCursor,NULL,IDC_ARROW
    69.         mov  [wndCls.hCursor],eax
    70.     invoke    RegisterClass,wndCls
    71.  
    72.     invoke    CreateWindowEx,WS_EX_CLIENTEDGE,\
    73.         wndClsName,wndTitle,\
    74.         WS_OVERLAPPEDWINDOW + WS_VISIBLE,\
    75.         CW_USEDEFAULT,CW_USEDEFAULT,400,240,\
    76.         NULL,NULL,[insH],NULL
    77.         mov  [wndH],eax
    78.  
    79.     invoke    InitCommonControls
    80.  
    81. ;+---------------------------+
    82. ;| entering the message loop |
    83. ;+---------------------------+
    84. window_message_loop_start:
    85.     invoke    GetMessage,wndMsg,NULL,0,0
    86.         or    eax,eax
    87.         je    window_message_loop_end
    88.     invoke    TranslateMessage,wndMsg
    89.     invoke    DispatchMessage,wndMsg
    90.         jmp    window_message_loop_start
    91.  
    92. window_message_loop_end:
    93.     invoke    ExitProcess,0
    94.  
    95. ;+----------------------+
    96. ;| the window procedure |
    97. ;+----------------------+
    98. proc window_procedure,hWnd,uMsg,wParam,lParam
    99.         push ebx esi edi
    100.         cmp  [uMsg],WM_COMMAND
    101.         je   wmCOMMAND
    102.         cmp  [uMsg],WM_NOTIFY
    103.         je   wmNOTIFY
    104.         cmp  [uMsg],WM_CREATE
    105.         je   wmCREATE
    106.         cmp  [uMsg],WM_SIZE
    107.         je   wmSIZE
    108.         cmp  [uMsg],WM_DESTROY
    109.         je   wmDESTROY
    110.  
    111.     wmDEFAULT:
    112.         invoke    DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    113.             jmp  wmBYE
    114.  
    115.     wmCOMMAND:
    116.             cmp  [lParam],0
    117.             jne  wmBYE
    118.         invoke    GetWindowLong,[lvH],GWL_STYLE
    119.             and  eax,not LVS_TYPEMASK
    120.             mov  edx,[wParam]
    121.             and  edx,0xFFFF
    122.             push edx
    123.             or   eax,edx
    124.         invoke    SetWindowLong,[lvH],GWL_STYLE,eax
    125.             pop  edx
    126.         invoke    CheckMenuRadioItem,[menuH],MI_ICON,MI_LIST,edx,MF_CHECKED
    127.             jmp  wmBYE
    128.  
    129.     wmNOTIFY:
    130.             mov  ebx,[lParam]
    131.             mov  eax,[ebx + NMHDR.hwndFrom]
    132.             cmp  eax,[lvH]
    133.             jne  wmDEFAULT
    134.  
    135.             cmp  [ebx + NMHDR.code],LVN_COLUMNCLICK
    136.             je   wmNOTIFY_LVN_COLUMNCLICK
    137.             cmp  [ebx + NMHDR.code],NM_DBLCLK
    138.             je   wmNOTIFY_NM_DBLCLK
    139.             jmp  wmDEFAULT
    140.  
    141.         wmNOTIFY_LVN_COLUMNCLICK:
    142.             cmp  [ebx + NMLISTVIEW.iSubItem],1
    143.             je   COLUMNCLICK_SIZE
    144.             jmp  COLUMNCLICK_FILE
    145.  
    146.             COLUMNCLICK_SIZE:
    147.                     cmp  [lvSortSize],1
    148.                     je   SIZE_1
    149.  
    150.                 SIZE_0:
    151.                     mov  [lvSortSize],1
    152.                     jmp  @f
    153.  
    154.                 SIZE_1:
    155.                     mov  [lvSortSize],2
    156.  
    157.             @@:
    158.                 invoke    SendMessage,[lvH],LVM_SORTITEMS,[lvSortSize],lv_compare
    159.                 call    lv_param_update
    160.                     jmp  wmBYE
    161.  
    162.             COLUMNCLICK_FILE:
    163.                     cmp  [lvSortFile],3
    164.                     je   FILE_4
    165.  
    166.                 FILE_3:
    167.                     mov  [lvSortFile],3
    168.                     jmp  @f
    169.  
    170.                 FILE_4:
    171.                     mov  [lvSortFile],4
    172.             @@:
    173.                 invoke    SendMessage,[lvH],LVM_SORTITEMS,[lvSortFile],lv_compare
    174.                 call    lv_param_update
    175.                     jmp  wmBYE
    176.          
    177.         wmNOTIFY_NM_DBLCLK:
    178.             call    lv_item_focus
    179.                 jmp  wmBYE          
    180.  
    181.  
    182.     wmSIZE:
    183.             mov  eax,[lParam]
    184.             mov  edx,eax
    185.             and  eax,0xFFFF
    186.             shr  edx,16
    187.         invoke    MoveWindow,[lvH],0,0,eax,edx,TRUE
    188.             jmp  wmBYE
    189.  
    190.     wmCREATE:
    191.         invoke    CreateWindowEx,NULL,ctlClsNameLv,NULL,\
    192.             LVS_REPORT + WS_CHILD + WS_VISIBLE,\
    193.             0,0,0,0,\
    194.             [hWnd],NULL,[insH],NULL
    195.             mov  [lvH],eax
    196.         call    lv_col_insert
    197.         call    lv_col_info_fill
    198.             RGB 0xAF,0xB5,0xC9
    199.         invoke    SendMessage,[lvH],LVM_SETTEXTCOLOR,0,eax
    200.             RGB 0x2E,0x35,0x50
    201.         invoke    SendMessage,[lvH],LVM_SETBKCOLOR,0,eax
    202.             RGB 0x2E,0x35,0x50
    203.         invoke    SendMessage,[lvH],LVM_SETTEXTBKCOLOR,0,eax
    204.         invoke    GetMenu,[hWnd]
    205.             mov  [menuH],eax
    206.         invoke    CheckMenuRadioItem,eax,MI_ICON,MI_LIST,MI_REPORT,MF_CHECKED
    207.             jmp  wmBYE
    208.  
    209.     wmDESTROY:
    210.         invoke    PostQuitMessage,0
    211.  
    212.     wmBYE:
    213.         pop edi esi ebx
    214.         return
    215.    endp
    216.  
    217. proc lv_item_focus
    218.     lvi4    LVITEM
    219.     buf4    rb 0xFF
    220.     enter
    221.  
    222.     invoke    SendMessage,[lvH],LVM_GETNEXTITEM,-1,LVNI_FOCUSED
    223.         mov  [lvi4.iItem],eax
    224.         mov  [lvi4.iSubItem],0
    225.         mov  [lvi4.mask],LVIF_TEXT
    226.         lea  eax,[buf4]
    227.         mov  [lvi4.pszText],eax
    228.         mov  [lvi4.cchTextMax],0xFF
    229.         lea  eax,[lvi4]
    230.     invoke    SendMessage,[lvH],LVM_GETITEM,0,eax
    231.         lea  eax,[buf4]
    232.     invoke    MessageBox,NULL,eax,wndTitle,MB_OK
    233.     return
    234. endp
    235.  
    236. proc lv_param_update
    237.     lvi1    LVITEM
    238.     enter
    239.         invoke    SendMessage,[lvH],LVM_GETITEMCOUNT,0,0
    240.             mov  ebx,eax
    241.             mov  [lvi1.mask],LVIF_PARAM
    242.             mov  [lvi1.iSubItem],0
    243.             mov  [lvi1.iItem],0
    244.     @@:
    245.             cmp  ebx,0
    246.             je   @f
    247.             push [lvi1.iItem]
    248.             pop  [lvi1.lParam]
    249.             lea  eax,[lvi1]
    250.         invoke    SendMessage,[lvH],LVM_SETITEM,0,eax
    251.             inc  [lvi1.iItem]
    252.             dec  ebx
    253.             jmp  @b
    254.     @@:
    255.         return
    256. endp
    257.  
    258. proc convert_strhval,str
    259.     result    dd ?
    260.     enter
    261.         push ecx edi edx esi
    262.         mov  [result],0
    263.         mov  edi,[str]
    264.     invoke    lstrlen,[str]
    265.  
    266.     a:
    267.         cmp  eax,0
    268.         je   b
    269.         xor  edx,edx
    270.         mov  dl,[edi]
    271.         sub  dl,'0'
    272.         mov  esi,eax
    273.         dec  esi
    274.         push eax
    275.         mov  eax,edx
    276.         push ebx
    277.         mov  ebx,10
    278.     @@:
    279.         cmp  esi,0
    280.         je   @f
    281.         mul  ebx
    282.         dec  esi
    283.         jmp  @b
    284.     @@:
    285.         pop  ebx
    286.         add  [result],eax
    287.         pop  eax
    288.         inc  edi
    289.         dec  eax
    290.         jmp  a
    291.     b:
    292.         pop  esi edx edi ecx
    293.         mov  eax,[result]
    294.         return
    295. endp
    296.  
    297. proc lv_compare,lParam1,lParam2,lParamSort
    298.     buf1    rb 0xFF
    299.     buf2    rb 0xFF
    300.     lvi0    LVITEM
    301.     enter
    302.         mov  [lvi0.mask],LVIF_TEXT
    303.         lea  eax,[buf1]
    304.         mov  [lvi0.pszText],eax
    305.         mov  [lvi0.cchTextMax],0xFF
    306.  
    307.         cmp  [lParamSort],2
    308.         jbe  compare_1
    309.         jmp  compare_3
    310.         return
    311.  
    312.     compare_1:
    313.             push edi
    314.             mov  [lvi0.iSubItem],1
    315.             lea  eax,[lvi0]
    316.         invoke    SendMessage,[lvH],LVM_GETITEMTEXT,[lParam1],eax
    317.             lea  eax,[buf1]
    318.         stdcall    convert_strhval,eax
    319.             mov  edi,eax
    320.             lea  eax,[lvi0]
    321.         invoke    SendMessage,[lvH],LVM_GETITEMTEXT,[lParam2],eax
    322.             lea  eax,[buf1]
    323.         stdcall    convert_strhval,eax
    324.             cmp  [lParamSort],1
    325.             jne  @f
    326.             sub  edi,eax
    327.             mov  eax,edi
    328.             jmp  compare_1_exit
    329.         @@:
    330.             sub  eax,edi
    331.  
    332.         compare_1_exit:
    333.                 pop  edi
    334.                 return
    335.  
    336.     compare_3:
    337.             mov  [lvi0.iSubItem],0
    338.             lea  eax,[lvi0]
    339.         invoke    SendMessage,[lvH],LVM_GETITEMTEXT,[lParam1],eax
    340.             lea  edx,[buf2]        ;destination
    341.             lea  eax,[buf1]        ;source
    342.         invoke    lstrcpy,edx,eax
    343.             lea  eax,[lvi0]
    344.         invoke    SendMessage,[lvH],LVM_GETITEMTEXT,[lParam2],eax
    345.             lea  edx,[buf2]
    346.             lea  eax,[buf1]
    347.             cmp  [lParamSort],3
    348.             jne  @f
    349.         invoke    lstrcmpi,edx,eax
    350.             return
    351.         @@:
    352.         invoke    lstrcmpi,eax,edx
    353.             return
    354.  
    355. endp
    356.  
    357. proc lv_col_insert
    358.     lvCol    LVCOLUMN
    359.     enter
    360.         mov  [lvCol.mask],LVCF_TEXT + LVCF_WIDTH
    361.         mov  [lvCol.pszText],lvTxt1
    362.         mov  [lvCol.cx],150
    363.         lea  edx,[lvCol]
    364.         push edx
    365.     invoke    SendMessage,[lvH],LVM_INSERTCOLUMN,0,edx
    366.         or   [lvCol.mask],LVCF_FMT
    367.         mov  [lvCol.fmt],LVCFMT_RIGHT
    368.         mov  [lvCol.pszText],lvTxt2
    369.         mov  [lvCol.cx],100
    370.     invoke    SendMessage,[lvH],LVM_INSERTCOLUMN,1
    371.         return
    372. endp
    Продолжение ниже
     
    Последнее редактирование: 12 дек 2016
    rococo795 нравится это.
  18. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Код (ASM):
    1. proc lv_col_info_fill
    2.         push edi
    3.     invoke  FindFirstFile,fTxt1,fData
    4.         cmp  eax,INVALID_HANDLE_VALUE
    5.         je   fill_exit
    6.         mov  [fFileH],eax
    7.         xor  edi,edi
    8.        
    9.     fill_start:
    10.             cmp  eax,0
    11.             je   fill_end
    12.  
    13.             cmp  [fData.dwFileAttributes],FILE_ATTRIBUTE_DIRECTORY
    14.             je   @f
    15.         stdcall lv_col_info_insert,edi
    16.             inc  edi
    17.  
    18.         @@:
    19.         invoke  FindNextFile,[fFileH],fData
    20.             jmp  fill_start
    21.  
    22.     fill_end:
    23.         invoke  FindClose,[fFileH]
    24.        
    25.     fill_exit:
    26.         pop  edi
    27.         return
    28. endp
    29.  
    30. proc lv_col_info_insert,row
    31.     lvi2    LVITEM
    32.     buf3    rb 20
    33.     enter
    34.  
    35.         mov  [lvi2.mask],LVIF_TEXT + LVIF_PARAM
    36.         mov  [lvi2.pszText],fData.cFileName
    37.         mov  [lvi2.iSubItem],0
    38.         push [row]
    39.         push [row]
    40.         pop  [lvi2.iItem]
    41.         pop  [lvi2.lParam]
    42.  
    43.         lea  eax,[lvi2]
    44.     invoke  SendMessage,[lvH],LVM_INSERTITEM,0,eax
    45.         mov  [lvi2.mask],LVIF_TEXT
    46.         inc  [lvi2.iSubItem]
    47.         lea  eax,[buf3]
    48.     invoke  wsprintf,eax,lvTxt3,[fData.nFileSizeLow]
    49.         lea  eax,[buf3]
    50.         mov  [lvi2.pszText],eax
    51.         lea  eax,[lvi2]
    52.     invoke  SendMessage,[lvH],LVM_SETITEM,0,eax
    53.         return
    54. endp
    55.  
    56. section '.idata' import data readable
    57.     library kernel32, 'KERNEL32.DLL',\
    58.         user32,   'USER32.DLL',\
    59.         comctl32, 'COMCTL32.DLL'
    60.  
    61.     include '%fasminc%\apia\Kernel32.inc'
    62.     include '%fasminc%\apia\User32.inc'
    63.     include '%fasminc%\apia\Comctl32.inc'
    64.  
    65. section '.rsrc' resource from 'tut_31.rc.res'
    Текст tut_31.rc
    Код (C):
    1. #define M_MAIN 10000
    2. #define MI_ICON     0x0000
    3. #define MI_SMALLICON    0x0002
    4. #define MI_LIST     0x0003
    5. #define MI_REPORT   0x0001
    6.  
    7. M_MAIN MENU
    8. {
    9.     POPUP "&View"
    10.     {
    11.         MENUITEM "Lar&ge Icons",MI_ICON
    12.         MENUITEM "S&mall Icons",MI_SMALLICON
    13.         MENUITEM "&List",MI_LIST
    14.         MENUITEM "&Details",MI_REPORT
    15.     }
    16. }
    Результат

    [​IMG]
     

    Вложения:

    • tut_31b.gif
      tut_31b.gif
      Размер файла:
      4,7 КБ
      Просмотров:
      2.661
    rococo795 нравится это.
  19. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709

    Win32 API. Урок 32. Создание MDI-приложения

    Код (ASM):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. MI_NEW        = 40005
    7. MI_CLOSE    = 40006
    8. MI_EXIT        = 40001
    9. MI_TILEHOR    = 40002
    10. MI_TILEVER    = 40003
    11. MI_CASCADE    = 40004
    12. section '.data' data readable writeable
    13.     insH        dd ?
    14.     wndFH        dd ?
    15.     wndCH        dd ?
    16.  
    17.     wndFTitle    db 'Tutorial 32',0
    18.     wndMdiTitle    db 'Mdi Child',0
    19.  
    20.     wndFClsName    db 'TUT_32',0
    21.     wndCClsName    db 'MDICLIENT',0
    22.     wndMdiClsName    db 'TUT_32_MDI',0
    23.  
    24.     wndCCcs        CLIENTCREATESTRUCT
    25.     wndMdiCs    MDICREATESTRUCT
    26.     wndCls        WNDCLASS
    27.     wndMsg        MSG
    28.  
    29.     wndFMenuH    dd ?
    30.     wndMdiMenuH    dd ?
    31.  
    32.     msg1        db 'Are you sure you want to',13,10,'close this window ?',0
    33.    
    34. section '.code' code readable executable
    35. start:
    36.     invoke    GetModuleHandle,0
    37.         mov  [insH],eax
    38.         mov  [wndCls.hInstance],eax
    39.         mov  [wndCls.style],CS_HREDRAW or CS_VREDRAW
    40.         mov  [wndCls.lpfnWndProc],window_procedure
    41.         mov  [wndCls.lpszClassName],wndFClsName
    42.         mov  [wndCls.hbrBackground],COLOR_APPWORKSPACE
    43.         mov  [wndCls.lpszMenuName],30
    44.     invoke    LoadIcon,NULL,IDI_APPLICATION
    45.         mov  [wndCls.hIcon],eax
    46.     invoke    LoadCursor,NULL,IDC_ARROW
    47.         mov  [wndCls.hCursor],eax
    48.     invoke    RegisterClass,wndCls
    49.  
    50.         mov  [wndCls.lpszMenuName],NULL
    51.         mov  [wndCls.lpfnWndProc],window_child_procedure
    52.         mov  [wndCls.lpszClassName],wndMdiClsName
    53.     invoke    RegisterClass,wndCls
    54.  
    55.     invoke    CreateWindowEx,WS_EX_CLIENTEDGE,wndFClsName,wndFTitle,\
    56.         WS_OVERLAPPEDWINDOW + WS_CLIPCHILDREN + WS_VISIBLE,\
    57.         CW_USEDEFAULT,CW_USEDEFAULT,500,320,\
    58.         NULL,NULL,[insH],NULL
    59.         mov  [wndFH],eax
    60.  
    61.     invoke    LoadMenu,[insH],31
    62.         mov  [wndMdiMenuH],eax
    63.  
    64.     ;+---------------------------+
    65.     ;| entering the message loop |
    66.     ;+---------------------------+
    67.     window_message_loop_start:
    68.         invoke    GetMessage,wndMsg,NULL,0,0
    69.             or   eax,eax
    70.             je   window_message_loop_end
    71.         invoke    TranslateMDISysAccel,[wndCH],wndMsg
    72.             or   eax,eax
    73.             jne  window_message_loop_start
    74.         invoke    TranslateMessage,wndMsg
    75.         invoke    DispatchMessage,wndMsg
    76.             jmp  window_message_loop_start
    77.  
    78.     window_message_loop_end:
    79.         invoke    DestroyMenu,[wndMdiMenuH]
    80.         invoke    ExitProcess,0
    81.  
    82.     ;+----------------------+
    83.     ;| the window procedure |
    84.     ;+----------------------+
    85.     proc window_procedure,hWnd,uMsg,wParam,lParam
    86.         push ebx esi edi
    87.  
    88.         cmp  [uMsg],WM_COMMAND
    89.         je   wmCOMMAND
    90.         cmp  [uMsg],WM_CREATE
    91.         je   wmCREATE
    92.         cmp  [uMsg],WM_DESTROY
    93.         je   wmDESTROY
    94.  
    95.         wmDEFAULT:
    96.             invoke    DefFrameProc,[hWnd],[wndCH],[uMsg],[wParam],[lParam]
    97.                 jmp  wmBYE
    98.  
    99.         wmCREATE:
    100.             invoke    GetMenu,[hWnd]
    101.                 mov  [wndFMenuH],eax
    102.             invoke    GetSubMenu,eax,1
    103.                 mov  [wndCCcs.hWindowMenu],eax
    104.                 mov  [wndCCcs.idFirstChild],100
    105.             invoke    CreateWindowEx,NULL,wndCClsName,NULL,\
    106.                 WS_CHILD + WS_CLIPCHILDREN + WS_VISIBLE,\
    107.                 CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,\
    108.                 [hWnd],NULL,[insH],wndCCcs
    109.                 mov  [wndCH],eax
    110.  
    111.                 mov  [wndMdiCs.szClass],wndMdiClsName
    112.                 mov  [wndMdiCs.szTitle],wndMdiTitle
    113.                 push [insH]
    114.                 pop  [wndMdiCs.hOwner]
    115.                 mov  [wndMdiCs.x],CW_USEDEFAULT
    116.                 mov  [wndMdiCs.y],CW_USEDEFAULT
    117.                 mov  [wndMdiCs.cx],CW_USEDEFAULT
    118.                 mov  [wndMdiCs.cy],CW_USEDEFAULT
    119.  
    120.                 jmp  wmBYE
    121.  
    122.         wmCOMMAND:
    123.                 cmp  [wParam],0xFFFF and MI_EXIT
    124.                 je   wmCOMMAND_MI_EXIT
    125.                 cmp  [wParam],0xFFFF and MI_NEW
    126.                 je   wmCOMMAND_MI_NEW
    127.                 cmp  [wParam],0xFFFF and MI_TILEHOR
    128.                 je   wmCOMMAND_MI_TILEHOR
    129.                 cmp  [wParam],0xFFFF and MI_TILEVER
    130.                 je   wmCOMMAND_MI_TILEVER
    131.                 cmp  [wParam],0xFFFF and MI_CASCADE
    132.                 je   wmCOMMAND_MI_CASCADE
    133.                 cmp  [wParam],0xFFFF and MI_CLOSE
    134.                 je   wmCOMMAND_MI_CLOSE
    135.                 jmp  wmDEFAULT
    136.  
    137.             wmCOMMAND_MI_NEW:
    138.                 invoke    SendMessage,[wndCH],WM_MDICREATE,0,wndMdiCs
    139.                     jmp  wmBYE
    140.  
    141.             wmCOMMAND_MI_EXIT:
    142.                 invoke    SendMessage,[wndFH],WM_CLOSE,0,0
    143.                     jmp  wmBYE
    144.        
    145.             wmCOMMAND_MI_TILEHOR:
    146.                 invoke    SendMessage,[wndCH],WM_MDITILE,MDITILE_HORIZONTAL,0
    147.                     jmp  wmBYE
    148.  
    149.             wmCOMMAND_MI_TILEVER:
    150.                 invoke    SendMessage,[wndCH],WM_MDITILE,MDITILE_VERTICAL,0
    151.                     jmp  wmBYE
    152.  
    153.             wmCOMMAND_MI_CASCADE:
    154.                 invoke    SendMessage,[wndCH],WM_MDICASCADE,MDITILE_SKIPDISABLED,0
    155.                     jmp  wmBYE
    156.  
    157.             wmCOMMAND_MI_CLOSE:
    158.                 invoke    SendMessage,[wndCH],WM_MDIGETACTIVE,0,0
    159.                 invoke    SendMessage,eax,WM_CLOSE,0,0
    160.                     jmp  wmBYE
    161.  
    162.         wmDESTROY:
    163.             invoke    PostQuitMessage,0
    164.  
    165.         wmBYE:
    166.             pop edi esi ebx
    167.             return
    168.     endp
    169.  
    170.     proc window_child_procedure,hWnd,uMsg,wParam,lParam
    171.         cmp  [uMsg],WM_MDIACTIVATE
    172.         je   wcmMDIACTIVATE
    173.         cmp  [uMsg],WM_CLOSE
    174.         je   wcmCLOSE
    175.  
    176.         wcmDEFAULT:
    177.             invoke    DefMDIChildProc,[hWnd],[uMsg],[wParam],[lParam]
    178.                 return
    179.  
    180.         wcmMDIACTIVATE:
    181.                 mov  eax,[lParam]
    182.                 cmp  eax,[hWnd]
    183.                 jne  @f
    184.             invoke    GetSubMenu,[wndMdiMenuH],1
    185.             invoke    SendMessage,[wndCH],WM_MDISETMENU,[wndMdiMenuH],eax
    186.                 jmp  wcmMDIACTIVATE_EXIT
    187.             @@:
    188.             invoke    GetSubMenu,[wndFMenuH],1
    189.             invoke    SendMessage,[wndCH],WM_MDISETMENU,[wndFMenuH],eax
    190.  
    191.             wcmMDIACTIVATE_EXIT:
    192.                 invoke    DrawMenuBar,[wndFH]
    193.                     jmp  wcmBYE
    194.  
    195.         wcmCLOSE:
    196.             invoke    MessageBox,[wndCH],msg1,wndFTitle,MB_YESNO
    197.                 cmp  eax,IDYES
    198.                 jne  wcmBYE
    199.             invoke    SendMessage,[wndCH],WM_MDIDESTROY,[hWnd],0
    200.  
    201.         wcmBYE:
    202.                 return
    203.     endp
    204.  
    205. section '.idata' import data readable
    206.     library KERNEL32, 'KERNEL32.DLL',\
    207.         USER32,   'USER32.DLL'
    208.    
    209.     import    KERNEL32,\
    210.         GetModuleHandle,    'GetModuleHandleA',\
    211.         ExitProcess,        'ExitProcess'
    212.     import    USER32,\
    213.         RegisterClass,        'RegisterClassA',\
    214.         CreateWindowEx,        'CreateWindowExA',\
    215.         DefWindowProc,        'DefWindowProcA',\
    216.         LoadCursor,        'LoadCursorA',\
    217.         LoadIcon,        'LoadIconA',\
    218.         LoadMenu,        'LoadMenuA',\
    219.         DestroyMenu,        'DestroyMenu',\
    220.         GetMenu,        'GetMenu',\
    221.         GetSubMenu,        'GetSubMenu',\
    222.         DrawMenuBar,        'DrawMenuBar',\
    223.         SendMessage,        'SendMessageA',\
    224.         GetMessage,        'GetMessageA',\
    225.         MessageBox,        'MessageBoxA',\
    226.         DestroyWindow,        'DestroyWindow',\
    227.         DefFrameProc,        'DefFrameProcA',\
    228.         DefMDIChildProc,    'DefMDIChildProcA',\
    229.         TranslateMessage,    'TranslateMessage',\
    230.         TranslateMDISysAccel,    'TranslateMDISysAccel',\
    231.         DispatchMessage,    'DispatchMessageA',\
    232.         PostQuitMessage,    'PostQuitMessage'
    233.  
    234. section '.rsrc' resource from 'tut_32.rc.RES'
    Продолжение ниже
     

    Вложения:

    • tut_32.gif
      tut_32.gif
      Размер файла:
      5,4 КБ
      Просмотров:
      2.685
    rococo795 нравится это.
  20. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Текст tut_32.rc
    Код (C):
    1. #define LANG_NEUTRAL 0x00
    2. #define SUBLANG_NEUTRAL        0x00
    3.  
    4. #define MFT_SEPARATOR        0x800
    5.  
    6. #define MI_NEW            40005
    7. #define MI_CLOSE        40006
    8. #define MI_EXIT            40001
    9. #define MI_TILEHOR        40002
    10. #define MI_TILEVER        40003
    11. #define MI_CASCADE        40004
    12.  
    13. 30 MENUEX
    14. LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
    15. {
    16.     POPUP "&File"
    17.     {
    18.         MENUITEM "&New", MI_NEW
    19.         MENUITEM "",0,MFT_SEPARATOR
    20.         MENUITEM "&Exit", MI_EXIT
    21.     }
    22.     POPUP "&Window"
    23.     {
    24.         MENUITEM "Tile Horizontal", MI_TILEHOR
    25.         MENUITEM "Tile Vertical", MI_TILEVER
    26.         MENUITEM "Cascade", MI_CASCADE
    27.     }
    28. }
    29.  
    30. 31 MENUEX
    31. LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
    32. {
    33.     POPUP "&File"
    34.     {
    35.         MENUITEM "&New", MI_NEW
    36.         MENUITEM "&Close", MI_CLOSE
    37.         MENUITEM "",0,MFT_SEPARATOR
    38.         MENUITEM "&Exit", MI_EXIT
    39.     }
    40.     POPUP "&Window"
    41.     {
    42.         MENUITEM "Tile Horizontal", MI_TILEHOR
    43.         MENUITEM "Tile Vertical", MI_TILEVER
    44.         MENUITEM "Cascade", MI_CASCADE
    45.     }
    46. }

    Результат


    [​IMG]
     
    rococo795 нравится это.