WinCE Stack 异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)\r\n",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\r\n",pCs->dwData,pCs->cbData,pCs->lpData));  
63           
64         ......  
65       }  
66     }  
67   }  
68 }  

 

以上是关于WinCE Stack 异常的主要内容,如果未能解决你的问题,请参考以下文章

Telechips 8902 & WinCE6.0 平台下 overlay 使用冲突现象的分析

wince6.0启动异砦新手求助

(转)WinCE 开发问题:不支持 Open Generic 方法的 GetParameters。

WinCE 下 CPU 使用率的计算方法

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

异常和TCP通讯