首页
社区
课程
招聘
[旧帖] [讨论]win32汇编讲学---菜鸟讲学 0.00雪花
发表于: 2010-11-1 22:56 3678

[旧帖] [讨论]win32汇编讲学---菜鸟讲学 0.00雪花

2010-11-1 22:56
3678
收藏
免费 0
支持
分享
最新回复 (44)
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
.elseif  eax ==  WM_CREATE
      invoke  CreateWindowEx,NULL,\
        offset szButton,offset szButtonText,\
        WS_CHILD or WS_VISIBLE,\
        10,10,65,22,\
        hWnd,1,hInstance,NULL
;********************************************************************
    .elseif  eax ==  WM_CLOSE       ;eax肯定是系统的什么东西,它根据界面发生了什么情况就在 里面写入什么值。   和上面的
_ProcWinMain        proc        uses ebx edi esi,hWnd,uMsg,wParam,lParam   有关。

      invoke  DestroyWindow,hWinMain
      invoke  PostQuitMessage,NULL

多了这个东西;
    .elseif  eax ==  WM_CLOSE

WM_CLOSE是什么东西还不知道。寄存器值?

晚上不适合学汇编,明天就开始学习,消息循环机制;这东西就不理他了。我又不是要深入学习(在这里鄙视某些人说:你已经很深入了) 突然发现汇编真的很难得就是函数,一个函数有好几十个参数,不仅不能漏掉而且循序不能搞乱。当然我想微软 在设计API参数的时候是经过细心的思考的,仔细研读,API的参数就会发现有这个顺序的理由的。但是这个要多练再多练。而且还要很用心(这个留给软件开发者去做吧)
WM_XXX是window一个消息机制。的一个什么东西   哈哈猜对了。明天就会说到他
2010-11-2 22:37
0
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
阅读下面代码
                .while        TRUE
                        invoke        GetMessage,addr @stMsg,NULL,0,0   ;addr 是指引用一个局部变量。
                        .break        .if eax        == 0
                        invoke        TranslateMessage,addr @stMsg
                        invoke        DispatchMessage,addr @stMsg
                .endw
第一句:invoke        GetMessage,addr @stMsg,NULL,0,0
getmessage函数从消息列队里取得消息,填好(它自己填)MSG结构并返回
第二句:break        .if eax        == 0
在点击鼠标的情况下
如果取得的消息是WM_QUIT(这个可能是关闭按钮),那么eax的值为0,否则返回的指是非零。所以用.break .if eax==0 来检查返回值。
在按键盘的情况下:
translatemessage将MSG结构传给windows进行键盘消息的转换,当有键盘按下或者放开的时候,windows将产生WM_KEYDOWN和WM_WM_KEYUPP或WM_SYSKEYDOWN(可能是微标键按下)和WM_SYSKEYUP(.....放开)但这些消息的参数中包含的是键盘扫描代码,转换起来很不方便。因此就产生了 WM_CHAR和WM_SYSCHAR 消息。
2010-11-3 09:10
0
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
窗口过程是给windows回调用的,他必须遵循特定的格式,
_ProcWinMain        proc        uses ebx edi esi hWnd,uMsg,wParam,lParam; 函数名称随便,只是 后面的参数不能错。
        mov        eax,uMsg
        .if        eax == WM_XXX
                <处理WM_XXX 消息>
        .elseif        eax == WM_XXX
                <处理WM_XXX 消息>
        .elseif        eax ==        WM_CLOSE                ;这就是那个关闭按钮
        invoke        DestroyWindow,hWinMain                ;修改这个代码,能让这个窗口无法关闭。延伸:messagebox:对不起您人品不好不能关闭这个窗口,请撞墙后重试。
        invoke        PostQuitMessage,NULL       
        .else
        invoke        DefWindowProc,hWnd,uMsg,wParam,lParam
        xor        eax,eax       
        ret
        .endif
_ProcWinMain        endp
2010-11-3 09:32
0
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
贴代码:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain        proc        uses ebx edi esi hWnd,uMsg,wParam,lParam;申明“ProcWinMian”函数;API也属于一种函数,程序是由各个函数(功能,作用)构建起来的;而后面的参数就是说明要使用这个函数 的那个功能;参数(子功能)是函数(功能)的子集
                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_CLOSE   ;关闭按钮
                        invoke        DestroyWindow,hWinMain
                        invoke        PostQuitMessage,NULL
;********************************************************************
                .else
                        invoke        DefWindowProc,hWnd,uMsg,wParam,lParam    ;这个不能漏掉
                        ret       ;和上面的一样。是一对好鸳鸯。
                .endif
;********************************************************************
                xor        eax,eax
                ret

_ProcWinMain        endp
在例程里面只处理了两个消息实践
WM_PAINT  和 WM_CLOSE   ;一个窗口不可能只有两个消息事件对么?有拖动,最小化,最大化。等这些东西。你知道像例程离得那个窗口有多少个消息事件吗?查看 windows。inc就会发现有几百条。如果都要定义...那还不累死。所以DefWindowProc大神就出来了。它对所有的消息进行默认处理,比如点击最小化按钮,就最小化(你也可以定义你喜欢的动作比如:窗口关闭后送一朵小花等等..)关闭就关闭.....windows之关心eax的值,
2010-11-3 09:53
0
雪    币: 4
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
这贴我收藏了,我也正看,**一个
2010-11-3 10:02
0
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
代码是这样的:
        .elseif        eax ==        WM_CLOSE
                        invoke        DestroyWindow,hWinMain
                        invoke        PostQuitMessage,NULL
不能用  defwindowproc 代替 它;因为品目上可能不止一个窗口,windows无法确定那个窗口关闭代表着程序结束。试想一下,用户打开了一个输入参数的小窗口,单击确定按钮后关闭并回到主窗口,windows却不分三七二十一自动发送一个wm_QUIT程序就莫名其妙的退出了
PS:当defwindowproc 处理WM_CLOS消息的时候 只调用destory window来摧毁窗口

到第二次编译的时候提示:
G:\PrayayaV3\Software\RadASM\Masm32\Bin\ML.EXE /c /coff /Cp /nologo /I"G:\PrayayaV3\Software\RadASM\Masm32\Include" "G:\琢石成器 win32位汇编配套光盘\Chapter04\FirstWindow\FirstWindow.asm"
Assembling: G:\琢石成器 win32位汇编配套光盘\Chapter04\FirstWindow\FirstWindow.asm

无法删除文件G:\琢石成器 win32位汇编配套光盘\Chapter04\FirstWindow\FirstWindow.exe  ;说明程序还没有关闭

构建时发生错误.
总共编译时间 1750 毫秒
2010-11-3 10:04
0
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
这一节有点难度。我想今晚做一个关不了得窗口。点关闭的时候出现一个消息框提示,不能关闭。试着做一下别报太大的希望。
2010-11-3 18:35
0
雪    币: 37
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
33
eax ==  WM_CLOSE
close信息用自己的 不返回关闭就好了
另外窗口风格模式里  窗口右上角哪个XX图标去掉
2010-11-3 20:52
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
路过学习一下!
2010-11-4 20:45
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35
哈哈 不错哦 顶一个
2010-11-4 21:01
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
不错 ·······················
2010-11-4 21:10
0
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
没有钱就没有安全感。作假帐中.........我不能放弃。今天要 学习,菜单和快捷键的定义
2010-11-5 11:41
0
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
38
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#include                <resource.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define        ICO_MAIN                0x1000        //图标
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define        IDM_MAIN                0x2000        //菜单
#define        IDA_MAIN                0x2000        //加速键
#define        IDM_OPEN                0x4101
#define        IDM_OPTION                0x4102
#define        IDM_EXIT                0x4103   
#define        IDM_SETFONT                0x4201
#define        IDM_SETCOLOR        0x4202
#define        IDM_INACT                0x4203
#define        IDM_GRAY                0x4204
#define        IDM_BIG                        0x4205
#define        IDM_SMALL                0x4206
#define        IDM_LIST                0x4207
#define        IDM_DETAIL                0x4208
#define        IDM_TOOLBAR                0x4209
#define        IDM_TOOLBARTEXT        0x4210
#define        IDM_INPUTBAR        0x4211
#define        IDM_STATUSBAR        0x4212
#define        IDM_HELP                0x4301
#define        IDM_ABOUT                0x4302
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN        ICON                "Main.ico"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IDM_MAIN        menu        discardable
BEGIN
        popup        "文件(&F)"  //工具栏主菜单
        BEGIN
                menuitem        "打开文件(&O)...",        IDM_OPEN  子集菜单
                menuitem        "关闭文件(&C)...",        IDM_OPTION
                menuitem        separator
                menuitem        "退出(&X)",                IDM_EXIT
        END
        popup        "查看(&V)" //工具栏主菜单
        BEGIN
                menuitem        "字体(&F)...\tAlt+F",IDM_SETFONT    //自己菜单
                menuitem        "背景色(&B)...\tCtrl+Alt+B",IDM_SETCOLOR
                menuitem        separator
                menuitem        "被禁用的菜单项",        IDM_INACT,        INACTIVE
                menuitem        "被灰化的菜单项",        IDM_GRAY,        GRAYED
                menuitem        separator
                menuitem        "大图标(&G)",                IDM_BIG
                menuitem        "小图标(&M)",                IDM_SMALL
                menuitem        "列表(&L)",                        IDM_LIST
                menuitem        "详细资料(&D)",                IDM_DETAIL
                menuitem        separator
                popup                "工具栏(&T)"
                BEGIN
                   menuitem        "标准按钮(&S)",                IDM_TOOLBAR
                   menuitem        "文字标签(&C)",                IDM_TOOLBARTEXT
                   menuitem        "命令栏(&I)",                IDM_INPUTBAR
                END
                menuitem        "状态栏(&U)",                IDM_STATUSBAR
        END
        popup        "帮助(&H)"        ,HELP
        BEGIN
                menuitem        "帮助主题(&H)\tF1",        IDM_HELP
                menuitem        separator
                menuitem        "关于本程序(&A)...",IDM_ABOUT
        END
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IDA_MAIN        accelerators
BEGIN
                VK_F1,        IDM_HELP,        VIRTKEY
                "B",        IDM_SETCOLOR,VIRTKEY,CONTROL,ALT
                "F",        IDM_SETFONT,VIRTKEY,ALT
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2010-11-5 11:55
0
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
39
我觉得要思考的还是窗口间消息相互发送那才好玩。想象一下,用asm32反汇编后把 我们自己的消息接收代码插进去。然后用我写的程序去控制它。甭说有多刺激。那东西才值得思考。先学这些皮毛赚点钱先,然后在考虑那玩意。人活在这世上总该要做点什么对吧,
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
这家伙怎么看起来像C? 因为*.rc文件visual C++ SDK包含的资源编辑器rc.exe所产生的。
菜单ID
#include    <resource.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define  ICO_MAIN    0x1000  //图标
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define  IDM_MAIN    0x2000  //菜单
#define  IDA_MAIN    0x2000  //加速键
#define  IDM_OPEN    0x4101
#define  IDM_OPTION    0x4102
#define  IDM_EXIT    0x4103   

IDM_MAIN// 这是菜单ID的代号。
0x2000//  这是菜单ID;16进制表示  API在检查参数的时候发现小于10000h时就认为他是整数型,大于10000h是就当做字符指针处理。

学吧学吧,走吧走吧。总觉得走得太深了。还有些函数还怎么搞明白,把所有的函数都放在电子表格里列出来 后面还带着参数。下面就是中文注释。。。万幸感谢新东方,老友记CNN(PS:记得以前挨某人骗了,把骂CNN的事写到日记里。太不懂事了

先在资源脚本(*.rc)里定义好菜单和快捷键,然后再汇编里引用它们(是指定义Equ值)
先在我还不知道...贴上源代码先
2010-11-5 12:05
0
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming 3rd Edition>
; by 罗云彬, http://www.win32asm.com.cn
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Menu.asm
; 菜单资源的使用例子
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff Menu.asm
; rc Menu.rc
; Link /subsystem:windows Menu.obj Menu.res
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .386
                .model flat, stdcall
                option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN        equ                1000h        ;图标
IDM_MAIN        equ                2000h        ;菜单
IDA_MAIN        equ                2000h        ;加速键
IDM_OPEN        equ                4101h
IDM_OPTION        equ                4102h
IDM_EXIT        equ                4103h
IDM_SETFONT        equ                4201h
IDM_SETCOLOR        equ                4202h
IDM_INACT        equ                4203h
IDM_GRAY        equ                4204h
IDM_BIG                equ                4205h
IDM_SMALL        equ                4206h
IDM_LIST        equ                4207h
IDM_DETAIL        equ                4208h
IDM_TOOLBAR        equ                4209h
IDM_TOOLBARTEXT        equ                4210h
IDM_INPUTBAR        equ                4211h
IDM_STATUSBAR        equ                4212h
IDM_HELP        equ                4301h
IDM_ABOUT        equ                4302h
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .data?
hInstance        dd                ?
hWinMain        dd                ?
hMenu                dd                ?
hSubMenu        dd                ?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .const
szClassName        db        'Menu Example',0
szCaptionMain        db        'Menu',0
szMenuHelp        db        '帮助主题(&H)',0
szMenuAbout        db        '关于本程序(&A)...',0
szCaption        db        '菜单选择',0
szFormat        db        '您选择了菜单命令:%08x',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .code

                pushad
                invoke        wsprintf,addr @szBuffer,addr szFormat,_dwCommandID
                invoke        MessageBox,hWinMain,addr @szBuffer,offset szCaption,MB_OK
                popad
                ret

_DisplayMenuItem        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Quit                proc

                invoke        DestroyWindow,hWinMain
                invoke        PostQuitMessage,NULL
                ret

_Quit                endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain        proc        uses ebx edi esi hWnd,uMsg,wParam,lParam
                local        @stPos:POINT
                local        @hSysMenu

                mov        eax,uMsg
                .if        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_HELP,offset szMenuHelp
                        invoke        AppendMenu,@hSysMenu,0,IDM_ABOUT,offset szMenuAbout
;********************************************************************
; 处理菜单及加速键消息
;********************************************************************
                .elseif        eax ==        WM_COMMAND
                        invoke        _DisplayMenuItem,wParam
                        mov        eax,wParam
                        movzx        eax,ax
                        .if        eax ==        IDM_EXIT
                                call        _Quit
                        .elseif        eax >=        IDM_TOOLBAR && eax <= IDM_STATUSBAR
                                mov        ebx,eax
                                invoke        GetMenuState,hMenu,ebx,MF_BYCOMMAND
                                .if        eax ==        MF_CHECKED
                                        mov        eax,MF_UNCHECKED
                                .else
                                        mov        eax,MF_CHECKED
                                .endif
                                invoke        CheckMenuItem,hMenu,ebx,eax
                        .elseif        eax >=        IDM_BIG && eax <= IDM_DETAIL
                                invoke        CheckMenuRadioItem,hMenu,IDM_BIG,IDM_DETAIL,eax,MF_BYCOMMAND
                        .endif
;********************************************************************
; 处理系统菜单消息
;********************************************************************
                .elseif        eax == WM_SYSCOMMAND
                        mov        eax,wParam
                        movzx        eax,ax
                        .if        eax == IDM_HELP || eax == IDM_ABOUT
                                invoke        _DisplayMenuItem,wParam
                        .else
                                invoke        DefWindowProc,hWnd,uMsg,wParam,lParam
                                ret
                        .endif
;********************************************************************
; 按下右键时弹出一个POPUP菜单
;********************************************************************
                .elseif eax == WM_RBUTTONDOWN
                        invoke        GetCursorPos,addr @stPos
                        invoke        TrackPopupMenu,hSubMenu,TPM_LEFTALIGN,@stPos.x,@stPos.y,NULL,hWnd,NULL
;********************************************************************
                .elseif        eax ==        WM_CLOSE
                        call        _Quit
;********************************************************************
                .else
                        invoke        DefWindowProc,hWnd,uMsg,wParam,lParam
                        ret
                .endif
;********************************************************************
                xor        eax,eax
                ret

_ProcWinMain        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain        proc
                local        @stWndClass:WNDCLASSEX
                local        @stMsg:MSG
                local        @hAccelerator

                invoke        GetModuleHandle,NULL
                mov        hInstance,eax
                invoke        LoadMenu,hInstance,IDM_MAIN
                mov        hMenu,eax
                invoke        LoadAccelerators,hInstance,IDA_MAIN
                mov        @hAccelerator,eax
;********************************************************************
; 注册窗口类
;********************************************************************
                invoke        RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
                invoke        LoadIcon,hInstance,ICO_MAIN
                mov        @stWndClass.hIcon,eax
                mov        @stWndClass.hIconSm,eax
                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,\
                        100,100,400,300,\
                        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
2010-11-6 10:18
0
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
41
我不知道Menu.rc中的:
#define IDM_OPEN          0x4101
和Menu.asm中的
IDM_OPEN            edu      4101h
之间的联系

答案:  后面的值都是十六进制 4101
当IAP检测到这个数值后把它当做整数

实在搞不明白wsprintf()是什么东西。Google没有那么全的资料
postquitmessage  pexitcode 参数为NULL代表什么?
2010-11-6 10:23
0
雪    币: 117
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
42
来跟大家一起学习,希望以后能够互相进步
2010-11-6 10:26
0
雪    币: 109
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
43
invoke  TranslateMessage,addr @stMsg 为什么要这样写

因为TranslateMessage函数原型里接收的参数是一个const MSG *lpMsg,消息结构体指针的参数,所以要取stMsg的地址

实在搞不明白wsprintf()是什么东西。Google没有那么全的资料
postquitmessage  pexitcode 参数为NULL代表什么?

int wsprintf(
  LPTSTR lpOut,
  LPCTSTR lpFmt,
  ...
);
wsprintf就是把lpfmt和后面的可变参数组合成字符串放到lpOut指向的缓冲区里
2010-11-6 12:36
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
44
刚刚看完罗云彬的书,讲的内容很透彻!
2010-11-7 10:35
0
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
45
受不了第四章的灵异事件现在转到Intel 汇编语言设计上来。 这才是基础,没有读过他一切都是空谈,知其然不知所以然。
2010-12-8 17:37
0
游客
登录 | 注册 方可回帖
返回
//