首页
社区
课程
招聘
各位大人,看看这个源码,为什么会这么奇怪
发表于: 2006-10-2 21:45 4180

各位大人,看看这个源码,为什么会这么奇怪

2006-10-2 21:45
4180
这是一个罗云彬书上的一个例子,我把它帖出来,在注册了个类的时候,需要自己定一个类名,正常来讲,这个类名都是自定义的,为什么在这个例子里,只要把szClass改了其它名字,程序就不能执行了,不是不能执行,而是自动退出,我只作了一些小改动,把类名的一个字母删除,就不行了,我在错误的地方加了注释,大家帮忙看下,超级感激!!!!!

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming >
; by 罗云彬, http://asm.yeah.net
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; SuperClass.asm
; 超类化例子 ―― 从编辑控件派生一个只接收16进展字符的新控件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff SuperClass.asm
; rc SuperClass.rc
; Link /subsystem:windows SuperClass.obj SuperClass.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        1000
DLG_MAIN        equ        1000
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .data?

hInstance        dd        ?
hWinMain        dd        ?
lpOldProcEdit        dd        ?

                .const
szAllowedChar        db        '0123456789ABCDEFabcdef',08h
szEditClass        db        'Edit',0
;szClass                db        'HexEdit',0如果是这样就可以正常运行
szClass                db        'HEdit',0;这样就不能正常运行了

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; HexEdit控件的新窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcEdit        proc        uses ebx edi esi hWnd,uMsg,wParam,lParam

                mov        eax,uMsg
                .if        uMsg ==        WM_CHAR
                        mov        eax,wParam
                        mov        edi,offset szAllowedChar
                        mov        ecx,sizeof szAllowedChar
                        repnz        scasb
                        .if        ZERO?
                                .if        al > '9'
                                        and        al,not 20h
                                .endif
                                invoke        CallWindowProc,lpOldProcEdit,hWnd,uMsg,eax,lParam
                                ret
                        .endif
                .else
                        invoke        CallWindowProc,lpOldProcEdit,hWnd,uMsg,wParam,lParam
                        ret
                .endif
                xor        eax,eax
                ret

_ProcEdit        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 基于Edit类建立一个新的类:HexEdit
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_SuperClass        proc
                local        @stWC:WNDCLASSEX

                mov        @stWC.cbSize,sizeof @stWC
                invoke        GetClassInfoEx,NULL,addr szEditClass,addr @stWC
                push        @stWC.lpfnWndProc
                pop        lpOldProcEdit
                mov        @stWC.lpfnWndProc,offset _ProcEdit
                push        hInstance
                pop        @stWC.hInstance
                mov        @stWC.lpszClassName,offset szClass
                invoke        RegisterClassEx,addr @stWC
                ret

_SuperClass        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain        proc        uses ebx edi esi hWnd,wMsg,wParam,lParam

                mov        eax,wMsg
;********************************************************************
                .if        eax ==        WM_CLOSE
                        invoke        EndDialog,hWnd,NULL
;********************************************************************
                .else
                        mov        eax,FALSE
                        ret
                .endif
                mov        eax,TRUE
                ret

_ProcDlgMain        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
                invoke        GetModuleHandle,NULL
                mov        hInstance,eax
                invoke        _SuperClass
                invoke        DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
                invoke        ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                end        start

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
你还必须同时修改*.rc资源中的szClass名才行。
2006-10-2 22:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
原来是这样呀,谢谢版主了,现在电脑有点小问题,还没有试,呵呵不过我想这应该是正确的答案的,再次谢谢版主
2006-10-8 20:46
0
游客
登录 | 注册 方可回帖
返回
//