注册 登录
编程论坛 汇编论坛

win32汇编 窗口问题

jk656467091 发布于 2011-06-17 10:30, 971 次点击
                        .386
                        .model flat,stdcall
                        option casemap:none
;\\\\\\\\\\\\\\\\\\\

    include  windows.inc
    include  gdi32.inc
    include  user32.inc
    include  kernel32.inc
    includelib gdi32.lib
    includelib user32.lib
    includelib kernel32.lib
   
;\\\\\\\\\\\\\\\\\\\\\\\\\
   
        .data?

    hInstance  dd ?
    hWinMain   dd ?
        
        .const

    szClassName db 'chuangti',0
    szCaption   db ' 标题',0
    szText      db '努力学习',0

        .code

_WndProc  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,offset szText,-1,addr @stRect,DT_SINGLELINE or CENTER or 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
_WndProc endp




_WinMain  proc

    local  @stWndClass:WNDCALSSEX
    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.style,CS_HREDRAW or CS_VREDRAW   
    mov @stWndClass.cbSize,sizeof WNDCALLSEX
    mov @stWndClass.lpfnWndProc,_WndProc
    mov @stWndClass.hbrBackground,COLOE_WINDOW+1
    mov @stWndClass.lpClassName,offset szClassName
   

    invoke RegisterClassEX,addr @stWndClass

   
    invoke CreateWindowEX,WS_EX_CLINETEDGE,offset szClassName,offsetszCaption,WS_OVERLAPPEDWINDOW,\

        100,100,600,400,NULL,NULL,hInstanse,NULL

     mov hWinMain,eax

     invoke ShowWindow,hWinMain,SW_SHOWNORMAL
    invoke UpdateWindow,hWinMain
   
    .while   TRUE


    invoke  GetMessage,addr @stMsg,NULL,0,0
    invoke  TranslateMessage,addr @stMsg
    invoke  DisPatchMessage,@stMsg
        
    .endw
    ret

_WndMain endp

   

start:
    call _WinMain
    invoke ExitProcess,NULL
end start





    请教一下高手
为什么 我在编译的时候 经常出现什么 什么未定义 什么的 究竟 是哪里的问题呢?

123.asm(37) : error A2006: undefined symbol : @stps
123.asm(37) : error A2114: INVOKE argument type mismatch : argument : 2
123.asm(40) : error A2006: undefined symbol : CENTER
123.asm(40) : error A2114: INVOKE argument type mismatch : argument : 5
123.asm(62) : error A2006: undefined symbol : WNDCALSSEX
123.asm(62) : error A2195: parameter or local cannot have void type
123.asm(82) : error A2006: undefined symbol : RegisterClassEX
123.asm(85) : error A2006: undefined symbol : CreateWindowEX
123.asm(99) : error A2006: undefined symbol : DisPatchMessage
123.asm(104) : fatal error A1010: unmatched block nesting : _WndMain
NMAKE : fatal error U1077: 'e:\masm32\bin\ml.EXE' : return code '0x1'
Stop.


这是哪里的问题?  新手 请高手不要见笑O(∩_∩)O















5 回复
#2
jk6564670912011-06-17 10:35
怎么没人呢 ?
#3
jk6564670912011-06-17 10:38
别嫌问题简单啊!  帮帮忙!  跪求了!
#4
obstratiker2011-06-17 15:08
你定义的是 @stPs:PAINTSTRUCT ,但是在 37 行写成了 @stps
在 40 行中,CENTER 和 VCENTER 参数要加前缀 DT_  表示他们是绘图文字的变量
在 62 行,WNDCLASS 写错啦! 写成 WNDCALSS
76 行 sizeof WNDCLASSEX 写错
78 行 COLOR_WINDOW+1 写错
79 行 @stWndClass.lpszClassName 写错
82 和 85 行,RegisterClassEx ,CreateWindowEx 末尾是 Ex 不是 EX ,是 hInstance 不是 hInstanse ,offset szCaption 又沾一块了,WS_EX_CLIENTEDGE 又写错
99 行 ,是 DispatchMessage ,又写错,它的接收的参数是地址要加 addr
104 行,你定义的是 _WinMain  proc 但结尾写成 _WndMain endp

以上问题表示……晕,其实你可以自己解决



#5
jk6564670912011-06-17 19:55
回复 4楼 obstratiker
太谢谢你了!  ╮(╯▽╰)╭ 我写错的太多了!
#6
Alar302011-06-19 08:59
恭喜LZ问题解决哈
1