标题:关于win32汇编的初级问题
只看楼主
simon0227
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-11-11
结帖率:100%
已结贴  问题点数:20 回复次数:4 
关于win32汇编的初级问题
我现在正在看罗云彬的书,在第4章“第一个窗口程序”时遇到如下问题:
1,其中有两个全局变量,一个hInstance,另一个hWinMain.按书上说为一个事模板句柄,一个是窗口句柄。hInstance是hWinMain所知窗口的那个类,这两个句柄有啥联系和区别吗?

2, 关于子程序,这个程序有个子程序,即窗口过程。在子程序的定义中有参数,但是在回调过程中这参数是如何传递的,而且这参数顺序影响运行结果吗?

希望大牛指点!

源代码:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming >
; by 罗云彬, http://asm.
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 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
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .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_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,\
            100,100,600,400,\
            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



[ 本帖最后由 simon0227 于 2009-11-12 20:33 编辑 ]
搜索更多相关主题的帖子: 初级 汇编 
2009-11-12 20:30
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
得分:20 
hInstance是实例句柄,可以大概认为是一个EXE在内存中的一个实际例子。hWinMain只是该实例中的一个窗口句柄,因为这个例子比较简单,所以2个句柄没加区别。

窗口过程是注册窗口时传入stWndClass.lpfnWndProc的, 并不是我们的代码调用窗口过程,而是给操作系统调用。  在消息循环中,操作系统取得消息数据,然后调用窗口过程,调用前,操作系统先把消息数据什么的传给窗口过程,---具体按照什么样的顺序来传递,这是操作系统决定并且都约定好的--- 窗口过程只是接收参数,按照约定好的顺序来分辨哪个是哪个。好象那章有个图,是消息循环过程的那个,仔细看看有帮助.

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2009-11-12 21:38
simon0227
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-11-11
得分:0 
有点明白了。
谢谢!
2009-11-12 22:13
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
得分:0 
hInstance    dd        ? //上面版主说了,是一个实例
你也许会看到有别的地方要用到这个hInstance这个句柄,比如加载那些资源的地方要用到这个。
这个载入内存中时exe其实就是PE文件里的建议装入地址,就是ImageBase,值一般是400000,没更改的话。
一个程序运行后只有一个hInstance ,若是再运行这个程序的话,其实与先运行的程序是没相关的,里面的地址空间是互相独立的,
hWinMain    dd        ?                ;这个是一个窗口的句柄,
一个实例子中,可以有很多窗口,就有很多个不同的句柄,传消息时是用句柄来判断是那个窗口接受消息。
如一楼所言,看书里的那个图。很清楚说明了。
2009-11-12 22:54
simon0227
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-11-11
得分:0 
谢谢4楼的热心解答。
2009-11-12 22:58



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-292106-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.839947 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved