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

posted on 2008-03-07 13:47  Phinecos(洞庭散人)  阅读(664)  评论(0编辑  收藏  举报

导航