专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »数据库 » 易语言游戏开发: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我们得以正常退出因此几乎任何本讲述Win32 API设计书籍或文章不论国内还是国外都会以这样作为第章中举例

  然而就在前不久和往常闲来无事就翻起MSDN来不知如何就跑来看这个再熟悉不过GetMessage参考来了看不要紧头顶顿时冒出虚汗——原来这么多年我们这么写不能说是但绝对是有漏洞!来看MSDN上对于GetMessage讲解(节选):

  注意:下面段文字节选自MSDN Library _disibledevent=>{
  (bRet -1)
 {
  // handle the error and possibly exit
 }
 
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
}

  草译如下希望更多朋友能够看清:

  返回值

   如果该收到个除WM_QUIT的外事件其返回值为个非零值

   如果该收到个WM_QUIT事件其返回值为零

   如果该发生其返回值为-1例如如果hWnd是个无效窗口句柄或者lpMsg是个无效指针就会失败要获得额外信息GetLastError

  警告

   由于该返回值可能是非零、零或者-1请避免这样做:

while (GetMessage( lpMsg, hWnd, 0, 0)) ...

   返回值-1出现可能性意味着这样代码会导致应用致命因此我们应该编写这样代码:

BOOL bRet;

while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
  (bRet -1)
 {
  // handle the error and possibly exit
 }
 
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
}

  看到了吗?我们这么长时间以来直书写代码却在这个“警告”中被“明令禁止”了!可能有朋友会想这样不可能出错啊我们通常都在启动事件循环的前成功地创建了窗口并且检查了是否成功因此传递给GetMessage窗口句柄肯定是有效;而且我们通常在堆栈上分配msg并通过求址运算符(&)来计算它地址并传递给GetMessage也不大可能出现无效指针啊?但是还记得设计基本原理的吗——永远不要假设任何事情!因此看来我们该把过去写代码拿出来好好审视遍了

  这里仅提到了个这样被我们忽视技术细节我想定还有很多、更多这样被忽视东西存在!希望本文抛砖引玉大家把你们发现类似东西分享出来让大家都能够写出更加安全健壮吧!

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: