当前位置:首页 > 芯闻号 > 充电吧
[导读]在使用 VS2008 开发 WinCE7.0 的程序,测试发送 WM_COPYDATA 消息时,发现在 Debug 模式下接收方可以正确的接收到消息,消息中的数据也是正确的。换成 Release 模式

在使用 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 的代码逻辑):

// 消息发送处消息打包与发送的过程
COPYDATASTRUCT cs;
FilesList FileInfo;   // 待发送的数据,为一结构体,大小为 2624 字节

// 给结构体 FileInfo + cs 赋值
......
cs.lpData = &FileInfo;

// 消息发送
if(NULL != hServer)
{
  ::SendMessage(hServer,WM_COPYDATA,256,(LPARAM)&cs);
}

if(NULL != hClient)
{
  ::SendMessage(hClient,WM_COPYDATA,126,(LPARAM)&cs);
}

// Server 消息接收
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  ......
  
  switch (message) 
  {
    case WM_COPYDATA:
      // Leo 出错时下面这句 LOG 有输入: [Agent]WndProc - message received from test app: 0x4A(256,738496)
      RETAILMSG(1,(L"[Client]%s - message received from server: 0x%X(%d,%d)rn",CString(__FUNCTION__),message,wParam,lParam));
      {
        if(TRUE == ProcessMsgRcved(message,wParam,lParam))
        {
          ......
        }
        else
        {
          ......
        }
      }
      break;
      ......
      default:
          return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

BOOL ProcessMsgRcved(UINT message,WPARAM wParam,LPARAM lParam)
{
  BOOL bRet = TRUE;

  switch(message)
  {
  case WM_COPYDATA:
    {
      COPYDATASTRUCT *pCs = (COPYDATASTRUCT *)lParam;
      // 由 LOG: [Agent]WndProc - message received from test app: 0x4A(256,738496) 知 pCs 不为空。
      if(NULL != pCs)
      {
        // Leo 出错时没有下面这句 LOG 输入
        // 按程序正常的流程,应该走到此句 LOG 才对!
        RETAILMSG(1,(L"[Server]WM_COPYDATA - %d,%d,0x%Xrn",pCs->dwData,pCs->cbData,pCs->lpData));
        
        ......
      }
    }
  }
}



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭
关闭