首页
社区
课程
招聘
[求助]关于WIMasm32
发表于: 2008-2-12 16:09 4021

[求助]关于WIMasm32

2008-2-12 16:09
4021
我想问一下在下面的程序中为什么
invoke        TrackPopupMenu,hSubMenu,TPM_LEFTALIGN,@stPos.x,@stPos.y,NULL,hWnd,NULL

invoke        GetSubMenu,hMenu,1
                        
                         mov        hSubMenu,eax
这两句中的hSubMenu句柄要设为全局变量呢, 程序中红色部分,而不能用局部变量来替代呢,我感觉他只在子程序中运行啊.

.386
                .Model Flat,StdCall
                Option CaseMap:None
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;include
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib
include                gdi32.inc
includelib        gdi32.lib

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;equ等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IDI_MYICON           equ             4144d
IDA_MAIN           equ                   102d
IDR_MENUDEMO       equ             101d
IDM_FILE_NEW       equ             40002d
IDM_FILE_SAVE      equ             40003d
IDM_FILE_SAVE_AS   equ             40004d
IDM_APP_EXIT       equ             40005d
IDM_EDIT_UNDO      equ             40006d
IDM_EDIT_CUT       equ             40007d
IDM_EDIT_COPY      equ             40008d
IDM_EDIT_PASTE     equ             40009d
IDM_EDIT_CLEAR     equ             40010d
IDM_EDIT_CLEA      equ             40011d
IDM_BKGND_WHITE    equ             40012d
IDM_BKGND_LTGRAY   equ             40013d
IDM_BKGND_GRAY     equ             40014d
IDM_BKGND_DKGRAY   equ             40015d
IDM_BKGND_BLACK    equ             40016d
IDM_TIMER_START    equ             40017d
IDM_TIMER_STOP     equ             40018d
IDM_APP_HELP       equ             40019d
IDM_APP_ABOUT      equ             40020d

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;.data?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .data?
hInstance        dd        ?
hWinMain        dd        ?
hMenu                dd        ?
hSubMenu        dd        ?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;.data
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .const
szClassName        db        'MyClass',0
szText                db        'Win32 Assembly, Simple and powerful !',0
szCaptionMain    db    'My first Window !',0
szFormat        db        '您选择了菜单命令:%08x',0
szMsgCaption        db         'MENU ID',0
szMenuHelp        db        'Help!',0
szMenuAbout        db        'Menu about!',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .code

_DisplayMenuItem        Proc        _dwCommandID

                local        @szBuffer[256]:byte
               
                pushad
               
                invoke        wsprintf,addr @szBuffer,addr szFormat,_dwCommandID
               
                invoke        MessageBox,hWinMain,addr @szBuffer,addr szMsgCaption,MB_OK
               
                popad
               
                ret

_DisplayMenuItem        endp

;********************************************************************
               
_ProcWinMain     proc  uses ebx edi esi,hWnd,uMsg,wParam,lParam

                 local @stPs:PAINTSTRUCT
                 
                 local @stRect:RECT

                 local @hDc
                 
                 local @hSysMenu
                 
                 local @stPos:POINT
                 
            ;     local @hSubMenu
                 

                 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_COMMAND       
                       
                        mov        eax,wParam
                       
                        movzx        eax,ax
                       
                        invoke        _DisplayMenuItem,wParam

;********************************************************************
                .elseif          eax        ==  WM_SYSCOMMAND       
                       
                        mov        eax,wParam
                       
                        movzx        eax,ax
                       
                        .if        eax==IDM_APP_HELP        ||        eax==IDM_APP_ABOUT
                       
                        invoke        _DisplayMenuItem,wParam
                       
                        .else
                                invoke        DefWindowProc,hWnd,uMsg,wParam,lParam
                                ret
                        .endif
;********************************************************************

                 .elseif  eax ==    WM_CLOSE

                          invoke    DestroyWindow,hWinMain

                          invoke    PostQuitMessage,NULL
;********************************************************************

                .elseif        eax        ==        WM_RBUTTONDOWN
                       
                        invoke        GetCursorPos,addr @stPos
                       
                        invoke        TrackPopupMenu,hSubMenu,TPM_LEFTALIGN,@stPos.x,@stPos.y,NULL,hWnd,NULL
;********************************************************************
                          
                 .elseif        eax == WM_CREATE
                 
                         invoke        GetSubMenu,hMenu,1
                        
                         mov        hSubMenu,eax
                 
                         invoke        GetSystemMenu,hWnd,FALSE
                        
                         mov        @hSysMenu,eax
                        
                         invoke        AppendMenu,@hSysMenu,MF_SEPARATOR,0,NULL
                        
                         invoke  AppendMenu,@hSysMenu,0,IDM_APP_HELP,offset szMenuHelp
                        
                         invoke  AppendMenu,@hSysMenu,0,IDM_APP_ABOUT,offset szMenuAbout

              

;********************************************************************

                 .else

                          invoke    DefWindowProc,hWnd,uMsg,wParam,lParam

                                   ret

                          .endif

;********************************************************************

                 xor      eax,eax

                 ret

_ProcWinMain     endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain        proc
                LOCAL        @stWndClass:WNDCLASS

                LOCAL        @stMsg:MSG
               
                local    @hAccelerator

                invoke        GetModuleHandle,NULL

                mov                hInstance,eax

                invoke        RtlZeroMemory,addr @stWndClass,sizeof @stWndClass

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;注册窗口类:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                invoke        LoadCursor,0,IDC_ARROW

                mov        @stWndClass.hCursor,eax

                invoke        LoadIcon,hInstance,IDI_MYICON

                mov        @stWndClass.hIcon,eax

;                mov        @stWndClass.cbSize,sizeof WNDCLASSEX
               
                invoke        LoadMenu,hInstance,IDR_MENUDEMO
               
                mov        hMenu,eax
               
                invoke LoadAccelerators,hInstance,IDA_MAIN
               
                mov        @hAccelerator,eax

                push        hInstance

                pop        @stWndClass.hInstance

                mov        @stWndClass.style,CS_HREDRAW or CS_VREDRAW

                mov        @stWndClass.lpfnWndProc,offset _ProcWinMain

                mov        @stWndClass.hbrBackground,COLOR_WINDOW+1

                mov        @stWndClass.lpszMenuName,NULL

                mov        @stWndClass.lpszClassName,offset szClassName

                invoke        RegisterClass,addr @stWndClass

                invoke   CreateWindowEx,WS_EX_CLIENTEDGE,\

                          offset szClassName,offset szCaptionMain,\

                          WS_OVERLAPPEDWINDOW,\

                          100,100,800,540,\

                          NULL,hMenu,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        TranslateAccelerator,hWinMain,@hAccelerator,addr @stMsg
                       
                        .if        eax==0
                       
                        invoke        TranslateMessage,addr @stMsg

                        invoke        DispatchMessage,addr @stMsg
                        .endif
                .endw
               
                ret

_WinMain        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
                call        _WinMain

                invoke        ExitProcess,NULL

                end start
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;.data
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
hSubMenu菜单句柄是在WM_CREATE消息中获取的,不是在WM_RBUTTONDWON消息中获取的,不同的消息之间传递数据必须使用全局变量,不能使用局部变量。如果你要使用局部变量,你必须在出一个消息段中操作全部指令,如你上面的可以将hSubMenu改成局部变量,但你必须在WM_RBUTTONDOWN消息中操作全部指令。
      invoke GetSubMenu,hMenu,1
      mov @hSubMenu,eax      
      invoke  GetCursorPos,addr @stPos
      invoke  TrackPopupMenu,@hSubMenu,TPM_LEFTALIGN,@stPos.x,@stPos.y,NULL,hWnd,NULL
2008-2-12 16:53
0
雪    币: 227
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
_ProcWinMain     proc  uses ebx edi esi,hWnd,uMsg,wParam,lParam

                 local @stPs:PAINTSTRUCT
                 
                 local @stRect:RECT

                 local @hDc
                 
                 local @hSysMenu
                 
                 local @stPos:POINT
                 
                 local @hSubMenu

但是我的局部变量是定义在_ProcWnMain下的如红色处,而不是在消息里定义,应对这两个消息来说都有效啊,@hSubMenu是定义在_ProcWnMain下而不是在消息wm_CREATE或WM_RBUTTONDOWN里的.感觉还是有效的啊.
2008-2-12 17:10
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
4
局部变量是在整个函数里有效,但函数每处理一个消息局部变量的值都会变动,在WM_CREATE消息里取得的值在函数进入下一个消息时局部变量的值就会被更新。所以局部变量的值要在同一个消息段里处理,不能在再下一个消息段里处理。
2008-2-12 17:19
0
雪    币: 227
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
总算明白了,非常感谢.
2008-2-12 17:50
0
游客
登录 | 注册 方可回帖
返回
//