Μiss^依然 发表于 2013-3-13 11:33:02

win32汇编程序问题,怎么不显示窗口啊谁帮我看下,感激啊,代码如下

.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
includelib user32.lib
includelib gdi32.lib
includelib kernel32.lib
ICO_MAIN equ1000h ;图标
IDM_MAIN equ2000h ;菜单
IDA_MAIN equ2000h ;加速键
IDM_OPEN equ4101h
IDM_OPTION equ4102h
IDM_EXIT equ4103h
IDM_SETFONT equ4201h
IDM_SETCOLOR equ4202h
IDM_INACT equ4203h
IDM_GRAY equ4204h
IDM_BIGequ4205h
IDM_SMALL equ4206h
IDM_LIST equ4207h
IDM_DETAIL equ4208h
IDM_TOOLBAR equ4209h
IDM_TOOLBARTEXT equ4210h
IDM_INPUTBAR equ4211h
IDM_STATUSBAR equ4212h
IDM_HELP equ4301h
IDM_ABOUT equ4302h
.data?
hmenu   dd ?
hInstancedd ?
hWindMaindd ?
hacceleratordd ?
hSubmenudd ?
.const
szclassnamedb 'my class',0
szcaptionname db '练习程序',0
szformatdb "你选择了程序:%08x",0
.code
_DESPLAYMENUITEM proc _dwcommandid
local szbuffer:BYTE
pushad
invoke wsprintf,addr szbuffer,addr szformat,_dwcommandid
invoke MessageBox,hWindMain,addr szbuffer,offset szcaptionname,MB_OK
popad
ret
_DESPLAYMENUITEM endp
_QUIT PROC
pushad
invoke DestroyWindow,hWindMain
invoke PostQuitMessage,NULL
popad
ret
_QUIT endp
WIN_MAINPROC proc uses ebx esi edi ebp,hWnd,uMsg,wParam,lParam
local @stPos:POINT
local @hSysMenu
mov eax,uMsg
.if eax==WM_CREATE
invoke GetSubMenu,hmenu,1
mov hSubmenu,eax
.elseif eax== WM_COMMAND
mov eax,wParam
invoke _DESPLAYMENUITEM,ax
.if ax==IDM_EXIT
INVOKE _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 GetMenuState,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
.if ax==IDM_HELP||ax==IDM_ABOUT
invoke _DESPLAYMENUITEM,wParam
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
.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
WIN_MAINPROC endp


_WINMAIN proc
local @hwndclass:WNDCLASSEX
local @hMsg:MSG
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke RtlZeroMemory,addr @hwndclass,sizeof @hwndclass
invoke LoadMenu,hInstance,IDM_MAIN
mov hmenu,eax
invoke LoadAccelerators,hInstance,IDM_MAIN
mov haccelerator,eax
push hInstance
pop @hwndclass.hInstance
mov @hwndclass.cbSize,sizeof WNDCLASSEX
mov @hwndclass.style,CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
mov @hwndclass.hbrBackground,COLOR_WINDOW +1
mov @hwndclass.lpszClassName,offset szclassname
mov @hwndclass.lpfnWndProc,offset WIN_MAINPROC
invoke CreateWindowEx,WS_EX_PALETTEWINDOW,addr szclassname,addr szcaptionname,WS_OVERLAPPED,100,200,300,500,NULL,hmenu,\
hInstance,NULL
mov hWindMain,eax
invoke ShowWindow,hWindMain,SW_SHOWNORMAL
invoke UpdateWindow,hWindMain
.while TRUE
invoke GetMessage,addr @hMsg,NULL,0,0
.break .if eax==0
invoke TranslateAccelerator,hWindMain,haccelerator,addr @hMsg
.if eax==0
invoke TranslateMessage,addr @hMsg
invoke DispatchMessage,addr @hMsg
.endif
.endw
ret
_WINMAIN endp

start:
call _WINMAIN
invoke ExitProcess,NULL
end start

小生我怕怕 发表于 2013-3-14 21:09:47

按老罗那本书的例子,自己对照...

540167078 发表于 2013-4-12 22:20:50

没看完,感觉那个IF 好像不配对

540167078 发表于 2013-4-12 22:22:11

if ax==IDM_EXIT
这行,好像应该改为
.elseifeax==IDM_TEXT
页: [1]
查看完整版本: win32汇编程序问题,怎么不显示窗口啊谁帮我看下,感激啊,代码如下