首页
社区
课程
招聘
[求助]关于一个简单win32问题
发表于: 2009-9-23 22:28 3899

[求助]关于一个简单win32问题

2009-9-23 22:28
3899
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming >
; by 罗云彬, http://asm.yeah.net
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; FirstWindow.asm
; 窗口程序的模板代码
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff FirstWindow.asm
; Link /subsystem:windows FirstWindow.obj
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .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                ?

                .const

szClassName        db        'MyClass',0
szCaptionMain        db        'My first Window !',0
szText                db        'Win32 Assembly, Simple and powerful !',0
szButton        db        'button',0
szButtonText        db        '&OK1',0
szCaption1        db        'A MessageBox !',0
szText1          db        'Hello, World !',0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain        proc        uses ebx edi esi,hWnd,uMsg,wParam,lParam
                local        @stPs:PAINTSTRUCT
                local        @stRect:RECT
                local        @hDc

                mov        eax,uMsg
;********************************************************************
                .if        eax ==        WM_PAINT
                        invoke        BeginPaint,hWnd,addr @stPs
                        mov        @hDc,eax

                        invoke        GetClientRect,hWnd,addr @stRect
                        invoke        DrawText,@hDc,addr szText,-1,\
                                addr @stRect,\
                                DT_SINGLELINE or DT_CENTER or DT_VCENTER

                        invoke        EndPaint,hWnd,addr @stPs
;********************************************************************
                .elseif        eax ==        WM_CREATE
                        invoke        CreateWindowEx,WS_EX_WINDOWEDGE,\
                                offset szButton,offset szButtonText,\
                                WS_CHILD or WS_VISIBLE,\
                                230,100,65,22,\
                                hWnd,1,hInstance,NULL
                                mov hInstance,eax
                                 .elseif  eax == WM_COMMAND

                        mov eax,lParam

                        .elseif eax == 2               ;改成1也不行
                               
                               
                             invoke        MessageBox,NULL,offset szText1,offset szCaption1,MB_OK
                           invoke ExitProcess,NULL
                .elseif        eax ==        WM_CLOSE
                        invoke        DestroyWindow,hWinMain
                        invoke        PostQuitMessage,NULL
;********************************************************************
                .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,\
                        190,100,600,400,\
                        NULL,NULL,hInstance,NULL
                mov        hWinMain,eax
                invoke        ShowWindow,hWinMain,SW_SHOWNORMAL
                invoke        UpdateWindow,hWinMain
;********************************************************************
; 消息循环
;********************************************************************
                .while        TRUE
                        invoke        PeekMessage,addr @stMsg,NULL,0,0,PM_REMOVE
                        .IF EAX
                               
                        .endif
                        .break        .if @stMsg.message== 0
                        invoke        TranslateMessage,addr @stMsg
                        invoke        DispatchMessage,addr @stMsg
                .endw
                ret
        ;.while        TRUE
        ;                invoke GetMessage,addr @stMsg,NULL,0,0
        ;                .if eax==0
        ;                       
        ;               
        ;                .break        .if == 0
        ;                invoke        TranslateMessage,addr @stMsg
        ;                invoke        DispatchMessage,addr @stMsg
        ;        .endw
        ;        ret

_WinMain        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
                call        _WinMain
                invoke        ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                end        start

本来想在按下按钮后出现一个messagebox,却在关闭时出现了

不知道怎么回事

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 140
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
.elseif eax == 2               ;改成1也不行
.elseif eax ==MB_OK
2009-9-23 23:16
0
雪    币: 146
活跃值: (182)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
3
改成MB_OK还是不行哈
2009-9-24 11:35
0
雪    币: 140
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你的按钮资源的ID是什么就换成什么,之前没看清楚
2009-9-24 12:19
0
雪    币: 146
活跃值: (182)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
5
定义的就是1啊,改成这样就可以了:
         .elseif  eax == WM_COMMAND
                           
                        mov eax,wParam

                        
                               
                               
                             invoke        MessageBox,NULL,offset szText1,offset szCaption1,MB_OK
                             
                  
                             invoke ExitProcess,NULL

直接在.elseif eax == 2前加就可以了
2009-9-25 22:38
0
雪    币: 140
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
哦,知道你错在什么地方了,判断按钮是否被点击本身就是WM_COMMAND消息,而是.elseif eax == 2把它分出来了,如果要判断,应该是这样吧
  .elseif  eax == WM_COMMAND
                           
                        mov eax,wParam

                        
        
                             .if     eax==2
                             invoke  MessageBox,NULL,offset szText1,offset szCaption1,MB_OK
                             .endif
                  
                             invoke ExitProcess,NULL
2009-9-25 23:44
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你的这个问题实在是太简单了
不太想花太多的心思
2009-9-27 18:32
0
游客
登录 | 注册 方可回帖
返回
//