CreateWindowEx返回1400

先不说了,直接上代码吧,妹的,调了好长时间就是不知道那里的错误,可,等发现了,却不知是哭是笑哈

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;程序平台定义


.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中的,呵呵,到一段落了,看下别的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值