先不说了,直接上代码吧,妹的,调了好长时间就是不知道那里的错误,可,等发现了,却不知是哭是笑哈
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;程序平台定义
.386
.Model Flat,StdCall
Option CaseMap:None
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;文件包含
include windows.inc
include kernel32.inc
include user32.inc
include gdi32.inc
includelib gdi32.lib
includelib kernel32.lib
includelib user32.lib
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;数据段定义
.const
szTitle db "计算器",0
szClassName db "MyClass",0
szText db "beginPaint",0
szButton db "Button",0;我们创建按钮的类的名称
szCaption db "hehe",0
szError1 db "Instance error",0
szError2 db "CreateWindowEx error",0
szError3 db "RegisterWindow Error",0
szError4 db "ShowWIndow Error",0
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;常量段的定义
.data
hInstance dd ?;本程序的句柄所在
hWinMain dd ?;主窗口的句柄
hButton dd ?;按钮的句柄
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;代码段定义
.code
;******************************************************************************************************
;**窗口消息的处理函数
WinProc proc uses ebx edi esi,hWnd,uMsg,wParam,lParam
;定义局部变量
local @stPaint:PAINTSTRUCT;
local @stRect:RECT;
local @hDC;
mov eax,uMsg;
.if eax==WM_PAINT
invoke BeginPaint,hWnd,addr @stPaint;hWnd(输入参数,指向窗口句柄,@stPaint输出参数,接收绘画信息)
mov @hDC,eax
invoke GetClientRect,hWnd,addr @stRect;
invoke DrawText,@hDC,addr szText,-1,addr @stPaint, DT_SINGLELINE or DT_CENTER or DT_VCENTER;
invoke EndPaint,hWnd,addr @stPaint;s
.elseif eax==WM_CREATE
invoke CreateWindowEx,NULL, offset szButton,offset szCaption,WS_CHILD or WS_VISIBLE,10,10,65,22, hWnd, 1001, hInstance,NULL;
mov hButton,eax;
.elseif eax==WM_COMMAND
MOV eax,wParam;
.if ax==1001
invoke MessageBox,NULL,addr szCaption,NULL,NULL;
.endif
.elseif eax==WM_CLOSE
invoke DestroyWindow,hWinMain;
invoke PostQuitMessage,0;
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam;
ret;
.endif
xor eax,eax
ret;
WinProc endp;
;******************************************************************************************************
;******************************************************************************************************
;**主函数,主要作用是创建窗口类,注册,创建主窗口
;**以及分发消息
_WinMain proc
local @stWndClass:WNDCLASSEX;
local @stMsg:MSG;
invoke GetModuleHandle,NULL
mov hInstance,eax;保存本进程句柄
;这里需要注意的是取地址操作符是addr
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.lpfnWndProc,offset WinProc;
mov @stWndClass.lpszClassName,offset szClassName
mov @stWndClass.hbrBackground,COLOR_WINDOW+1;
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
;进行窗口的注册
invoke RegisterClassEx,addr @stWndClass;
;进行窗口的显示
invoke CreateWindowEx,WS_EX_CLIENTEDGE, offset szClassName,offset szTitle,WS_OVERLAPPED,1,1,500,200,NULL,NULL,hInstance,NULL;
;invoke GetLastError;
.if eax==0
invoke MessageBox,NULL,addr szError2,NULL,MB_OK
invoke ExitProcess,0
.endif
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
_WinMain endp
;******************************************************************************************************
start:
call _WinMain;
invoke MessageBox,NULL,offset szError1,NULL,0
invoke ExitProcess,0
end start;
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;PS:顺便说下addr和offset的区别,addr用于将标号的地址传递给被调用的函数,addr不可以处理向前引用,即如果想
;要使用变量或者标号必须在使用之前定义,addr可以处理局部变量,offset则不行,局部变量在堆栈中分配,而offset
;则在程序编译时编译器解释,即全局变量,也就是说,offset只能作用于全局变量,而addr则均可
PS;好了说下答案吧,原来我的出函数中没有错误,但是在WinProc中的.IF EAX==WM_CLOSE成了 .IF WM_CLOSE,WinProc
所以啊告诫大家,以后如果出现这种错误,也有可能是在WinProc中的,呵呵,到一段落了,看下别的