zoukankan      html  css  js  c++  java
  • WinCE Stack 异常

    在使用 VS2008 开发 WinCE7.0 的程序,测试发送 WM_COPYDATA 消息时,发现在 Debug 模式下接收方可以正确的接收到消息,消息中的数据也是正确的。换成 Release 模式后,接收方也能接收到消息,但有一接收方不进入数据解析函数。
    两个消息的接收方,一个是用 SDK 开发的 WinCE 程序(称为 C 程序);另一个发送到发送 WM_COPYDATA 消息的自身应用。先将 WM_COPYDATA 发送给应用、再将同样的消息发送给 C 程序。
    无论是在 Debug 模式,还是 Release 模式,C 程序都可以接收到正确的消息和数据。
     
    由于一般使用 Debug 模式进行程序的开发与调试,在程序开发结束时才切换到 Release 模式,是否是在使用 Debug 模式开发过程中,修改了什么导致两者表现不一样?
    由于已经可以确认代码没有问题,所以怀疑是系统的 Stack 出现问题。查看工程属性:配置属性/链接器/系统/堆栈保留大小,发现 Debug 模式下已经修改为默认值的 4 倍,即 262144,而 Release 模式下仍然在使用原始的默认值 65536。
     
    修改此项的设置值为:262144 后,编译运行,一切正常。
    OK 了。
     
    代码逻辑(由于 Client 是正确的,不再分析 Client 的代码逻辑):
     1 // 消息发送处消息打包与发送的过程  
     2 COPYDATASTRUCT cs;  
     3 FilesList FileInfo;   // 待发送的数据,为一结构体,大小为 2624 字节  
     4   
     5 // 给结构体 FileInfo + cs 赋值  
     6 ......  
     7 cs.lpData = &FileInfo;  
     8   
     9 // 消息发送  
    10 if(NULL != hServer)  
    11 {  
    12   ::SendMessage(hServer,WM_COPYDATA,256,(LPARAM)&cs);  
    13 }  
    14   
    15 if(NULL != hClient)  
    16 {  
    17   ::SendMessage(hClient,WM_COPYDATA,126,(LPARAM)&cs);  
    18 }  
    19   
    20 // Server 消息接收  
    21 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)  
    22 {  
    23   ......  
    24     
    25   switch (message)   
    26   {  
    27     case WM_COPYDATA:  
    28       // Leo 出错时下面这句 LOG 有输入: [Agent]WndProc - message received from test app: 0x4A(256,738496)  
    29       RETAILMSG(1,(L"[Client]%s - message received from server: 0x%X(%d,%d)
    ",CString(__FUNCTION__),message,wParam,lParam));  
    30       {  
    31         if(TRUE == ProcessMsgRcved(message,wParam,lParam))  
    32         {  
    33           ......  
    34         }  
    35         else  
    36         {  
    37           ......  
    38         }  
    39       }  
    40       break;  
    41       ......  
    42       default:  
    43           return DefWindowProc(hWnd, message, wParam, lParam);  
    44     }  
    45     return 0;  
    46 }  
    47   
    48 BOOL ProcessMsgRcved(UINT message,WPARAM wParam,LPARAM lParam)  
    49 {  
    50   BOOL bRet = TRUE;  
    51   
    52   switch(message)  
    53   {  
    54   case WM_COPYDATA:  
    55     {  
    56       COPYDATASTRUCT *pCs = (COPYDATASTRUCT *)lParam;  
    57       // 由 LOG: [Agent]WndProc - message received from test app: 0x4A(256,738496) 知 pCs 不为空。  
    58       if(NULL != pCs)  
    59       {  
    60         // Leo 出错时没有下面这句 LOG 输入  
    61         // 按程序正常的流程,应该走到此句 LOG 才对!  
    62         RETAILMSG(1,(L"[Server]WM_COPYDATA - %d,%d,0x%X
    ",pCs->dwData,pCs->cbData,pCs->lpData));  
    63           
    64         ......  
    65       }  
    66     }  
    67   }  
    68 }  
  • 相关阅读:
    2020最新JavaScript开发必须知道的41个技巧,你会几个?
    Vue项目上线要做哪些优化?面试必学
    javascript 关于dom节点操作的增删改查
    uniapp 上拉加载下拉刷新
    移动WEB适配布局
    微信小程序中封装网络请求方法
    react兄弟组件传值
    【python】Mutilindex多层索引的取值
    【python】通过Mutilindex生成二维表数据
    【python】python vs Excel ( 如何通过loc与iloc函数处理Excel数据)
  • 原文地址:https://www.cnblogs.com/91program/p/5205055.html
Copyright © 2011-2022 走看看