首页 »数据库 » 易语言游戏开发:Win32开发中最易踏上的地雷 »正文
易语言游戏开发:Win32开发中最易踏上的地雷
来源: 发布时间:星期四, 2009年2月12日 浏览:232次 评论:0
有关微软编程技术 书籍可谓多如牛毛 但读来读去感觉还是MSDN比较权威 这里就拿 个例子来说吧 可能让很多刚开始学习Win32 API 设计、甚至是 些已经有 定Win32 API经验 人感觉大汗淋漓
在学习Win32 API 设计时 “第 课”我想都会学到“事件循环”吧?很多书给出了类似这样 经典举例:
WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPCTSTR lpCmdLine, nCmdShow) { MSG msg; ... while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } ... ( )msg.wParam; }
没错吧?多么熟悉 事件循环 它可以很好地工作 当收到 个WM_QUIT事件 时候 GetMessage 返回0 我们![](/icons/65041de.gif) 得以正常退出 因此 几乎任何 本讲述Win32 API 设计 书籍或文章 不论国内 还是国外![](/icons/65041de.gif) 都会以这样 个 作为第 章中 举例![](/icons/65041dou2.gif)
然而 就在前不久 和往常 样 闲来无事就翻起MSDN来 不知如何![](/icons/65041de.gif) 就跑来看这个再熟悉不过 GetMessage![](/icons/65041kh.gif) ![](/icons/65041hanshu.gif) 参考来了 这 看不要紧 头顶顿时冒出虚汗——原来这么多年我们这么写![](/icons/65041chengxu.gif) 不能说是![](/icons/65041cuowu.gif) ![](/icons/65041de.gif) 但绝对是有漏洞!来看MSDN上对于GetMessage![](/icons/65041kh.gif) ![](/icons/65041hanshu.gif) 讲解(节选):
注意:下面 段文字节选自MSDN Library _disibledevent=>{ (bRet -1) { // handle the error and possibly exit } ![](/icons/65041else.gif) { TranslateMessage(&msg); DispatchMessage(&msg); } }
草译如下 希望更多 朋友能够看清:
返回值
如果该 收到 个除WM_QUIT的外 事件 其返回值为 个非零值![](/icons/65041dou2.gif)
如果该 收到 个WM_QUIT事件 其返回值为零![](/icons/65041dou2.gif)
如果该 发生![](/icons/65041cuowu.gif) 其返回值为-1 例如 如果hWnd是 个无效 窗口句柄 或者lpMsg是 个无效指针 该 就会失败 要获得额外![](/icons/65041de.gif) 信息 请 GetLastError![](/icons/65041dou2.gif)
警告
由于该![](/icons/65041hanshu.gif) 返回值可能是非零 、零或者-1 请避免这样做:
while (GetMessage( lpMsg, hWnd, 0, 0)) ...
返回值-1出现 可能性意味着这样 代码会导致应用![](/icons/65041chengxu.gif) 致命![](/icons/65041cuowu.gif) 因此 我们应该编写这样 代码:
BOOL bRet;
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { (bRet -1) { // handle the error and possibly exit } ![](/icons/65041else.gif) { TranslateMessage(&msg); DispatchMessage(&msg); } }
看到了吗?我们这么长时间以来 直书写 代码 却在这个“警告”中被“明令禁止”了!可能有 朋友会想 这样![](/icons/65041de.gif) 不可能出错啊 我们通常都在启动事件循环的前成功地创建了窗口 并且检查了是否成功 因此传递给GetMessage![](/icons/65041kh.gif) ![](/icons/65041hanshu.gif) 窗口句柄肯定是有效 ;而且 我们通常在堆栈上分配msg 并通过求址运算符(&)来计算它 地址并传递给GetMessage![](/icons/65041kh.gif) ![](/icons/65041hanshu.gif) 也不大可能出现无效指针啊?但是 还记得 设计 基本原理的 吗——永远不要假设任何事情!因此 看来我们该把过去写 代码拿出来好好审视 遍了![](/icons/65041dou2.gif)
这里仅提到了 个这样被我们忽视 技术细节 我想 定还有很多、更多这样 被忽视 东西存在!希望本文抛砖引玉 大家把你们发现 类似东西分享出来 让大家都能够写出更加安全健壮![](/icons/65041de.gif) 吧!
相关文章
读者评论
发表评论
|
|