Win32汇编学习笔记(三)

; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
 Sender.asm
;
 从一个程序向另一个窗口程序发送消息 之 发送程序
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        . 386
        .model flat,stdcall
        option 
casemap: none
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
 Include 文件定义
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        windows. inc
include        user32.
inc
includelib    user32.lib
include        kernel32.
inc
includelib    kernel32.lib
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
 数据段
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data
hWnd        dd    ?
szBuffer    db    
256  dup (?)

        .const
szCaption    db    
' SendMessage ' , 0
szStart        db    
' Press OK to start SendMessage, param: %08x! ' , 0
szReturn    db    
' SendMessage returned! ' , 0
szDestClass    db    
' MyClass ' , 0      ; 目标窗口的窗口类
szText        db     ' Text send to other windows ' , 0
szNotFound    db    
' Receive Message Window not found! ' , 0
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
 代码段
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
start:
        invoke    FindWindow,addr szDestClass,NULL
        .if    eax
            
mov     hWnd,eax     ; 找到目标窗口则发送消息
            invoke    wsprintf,addr szBuffer,addr szStart,addr szText
            invoke    MessageBox,NULL,offset szBuffer,offset szCaption,MB_OK
            invoke    SendMessage,hWnd,WM_SETTEXT,
0 ,addr szText
            invoke    MessageBox,NULL,offset szReturn,offset szCaption,MB_OK
        .else
            invoke    MessageBox,NULL,offset szNotFound,offset szCaption,MB_OK
        .endif
        invoke    ExitProcess,NULL
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        end    start
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

消息发送者代码:

;  Receiver.asm
;
 从一个程序向另一个窗口程序发送消息 之 消息接收程序
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

        .
386
        .model flat,stdcall
        option 
casemap: none
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
 Include 文件定义
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        windows. inc
include        gdi32.
inc
includelib    gdi32.lib
include        user32.
inc
includelib    user32.lib
include        kernel32.
inc
includelib    kernel32.lib
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
 数据段
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data?

hInstance    dd    ?
hWinMain    dd    ?
szBuffer    db    
512  dup (?)

        .const
szClassName    db    
' MyClass ' , 0
szCaptionMain    db    
' Receive Message ' , 0

szReceive    db    
' Receive WM_SETTEXT message ' ,0dh,0ah
        db    
' param: %08x ' ,0dh,0ah
        db    
' text: "%s" ' ,0dh,0ah, 0
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
 代码段
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
 窗口过程
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain    proc    uses ebx edi esi,hWnd,uMsg,wParam,lParam

        
mov     eax,uMsg
; ****************************************************************
        .if    eax ==    WM_CLOSE
            invoke    DestroyWindow,hWinMain
            invoke    PostQuitMessage,NULL
; ****************************************************************
;
 收到 WM_SETTEXT 消息则将消息字符串和字符串地址显示出来
;
****************************************************************
        .elseif    eax ==    WM_SETTEXT
            invoke    wsprintf,addr szBuffer,addr szReceive,\
                lParam,lParam
            invoke    MessageBox,hWnd,offset szBuffer,addr szCaptionMain,MB_OK
; ****************************************************************
        .else
            invoke    DefWindowProc,hWnd,uMsg,wParam,lParam
            
ret
        .endif
; ****************************************************************
         xor     eax,eax
        
ret

_ProcWinMain    endp

; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain    proc
        local    
@stWndClass: WNDCLASSEX
        local    
@stMsg: MSG

        invoke    GetModuleHandle,NULL
        
mov     hInstance,eax
        invoke    RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
; ****************************************************************
;
 注册窗口类
;
****************************************************************
        invoke    LoadCursor, 0 ,IDC_ARROW
        
mov     @stWndClass.hCursor,eax
        
push     hInstance
        
pop     @stWndClass.hInstance
        
mov     @stWndClass.cbSize,sizeof WNDCLASSEX
        
mov     @stWndClass.style,CS_HREDRAW  or  CS_VREDRAW
        
mov     @stWndClass.lpfnWndProc,offset _ProcWinMain
        
mov     @stWndClass.hbrBackground,COLOR_WINDOW +  1
        
mov     @stWndClass.lpszClassName,offset szClassName
        invoke    RegisterClassEx,addr @stWndClass
; ****************************************************************
;
 建立并显示窗口
;
****************************************************************
        invoke    CreateWindowEx,WS_EX_CLIENTEDGE    ,offset szClassName,offset szCaptionMain,\
            WS_OVERLAPPEDWINDOW,\
            
50 , 50 , 200 , 150 ,\
            NULL,NULL,hInstance,NULL
        
mov     hWinMain,eax
        invoke    ShowWindow,hWinMain,SW_SHOWNORMAL
        invoke    UpdateWindow,hWinMain
; ****************************************************************
;
 消息循环
;
****************************************************************
        .while    TRUE
            invoke    GetMessage,addr @stMsg,NULL,
0 , 0
            .break    .if eax    == 
0
            invoke    TranslateMessage,addr @stMsg
            invoke    DispatchMessage,addr @stMsg
        .endw
        
ret
_WinMain    endp
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
        
call     _WinMain
        invoke    ExitProcess,NULL
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        end    start


MakeFile文件:

LINK_FLAG  =   / subsystem :windows
ML_FLAG 
=   / / coff
all: Sender
. exe Receiver . exe
Sender
. exe: Sender . obj
    Link 
$( LINK_FLAG )  Sender . obj
Receiver
. exe: Receiver . obj
    Link 
$( LINK_FLAG )  Receiver . obj
. asm . obj:
    ml 
$( ML_FLAG )   $<
clean:
    
del  * . obj

你可能感兴趣的:(Win32)