wxWidgets wxWinCE suspend-resume crash(VC ++)

时间:2011-12-20 12:38:46

标签: visual-c++ crash windows-ce wxwidgets suspend

我遇到一些Windows CE 5.0设备的问题,这些设备在从待机状态恢复后暂时崩溃(暂停)。我已经将问题浓缩到大约15行C ++,只是让wxWidgets显示一个消息框,如果我:

将会遇到问题。
  1. 启动应用
  2. 暂停设备(我的意思是简单地按下红色电源按钮)
  3. 恢复设备
  4. 按下消息框标题中的“确定”按钮。
  5. BOOM
  6. 这个问题在我压缩之前以许多其他方式表现出来 - 加载位图,扫描条形码,一旦它被暂停,然后恢复。

    我使用以下内容:

    1. Windows CE 5.0 Professional(Motorola MC3090设备) (也是WM 6.5(MC55),CE 6.0(MC3190))
    2. Visual Studio 2005 SP2
    3. wxWidgets 2.8.10
    4. Microsoft Windows CE 5.0 Standard SDK
    5. 显示的实际错误是零星的和广泛的,但主要是访问冲突,通常靠近函数调用的起始地址(通过挂起设备发现这一点,然后重新启动然后在设备上附加VS调试器)。在这方面做了大量的功课,我已经阅读了一些建议,可能会发生某种堆腐败。只要应用程序没有暂停,它就能在所有正确的SDK和设备组合中正常工作。

      我还尝试了以下SDK:

      1. MS Pocket PC 2003 SDK
      2. 适用于MC3000c50a的Symbol Platform SDK
      3. 适用于MC3000c50b的Symbol Platform SDK
      4. Windows Mobile 5.0 SDK
      5. Windows Mobile 6.0 SDK
      6. 我测试了以下设备:

        1. MC3090(Windows CE 5.0) - 同样的问题
        2. MC55(Windows Mobile 6.5) - 同样的问题
        3. MC3190(Windows CE 6.0) - 使用StandardSDK版本的此设备上不会出现问题
        4. 我过度使用了wxWidgets的设置,总是确保我将应用程序与正确的相应SDK链接。

          以下是导致此问题的代码:

          #include "wx/wxprec.h"
          class Application : public wxApp {
          public:
              virtual bool OnInit();
          };
          
          bool Application::OnInit() {
              wxMessageBox(L"Test");
              return true;
          }
          
          IMPLEMENT_APP(Application)
          

          任何有一些建议的人,我都会永远感激不尽!如果我遗漏了任何重要细节,也请告诉我。

1 个答案:

答案 0 :(得分:2)

您是否正在使用SD卡运行应用程序?至少MC3090,我认为MC55,默认符合Windows CE标准的附加总线(最初定义为PCMCIA卡):当你暂停和恢复设备时,所有总线都被重置。这会导致卡暂时消失,并且卡上打开的文件的所有句柄都将失效。实际上这是因为设备可以在设备暂停时处理用户更换卡。

Windows CE是 demand-paged 操作系统。您的程序在启动时并非全部加载到RAM中:相反,页面仅从程序引用的可执行文件和DLL中加载。操作系统可以随时丢弃任何只读或未修改的页面,因为它可以从原始程序文件中重新读取它们(这就是程序运行时无法覆盖程序文件的原因)。如果EXE或DLL的句柄无效,并且您引用了尚未加载(或已被丢弃)的页面,则OS页面错误处理程序无法读取该页面,并且它会生成访问冲突异常。

对于MC3090,您可以配置SD卡驱动程序,以便在从睡眠状态恢复时“移除”卡。有关详细信息,请参阅Symbol的知识库文章MC30xx CE5.0 - Application aborting randomly when using SD Card。我在MC55上找不到如何执行此操作的详细信息。在MC70上,系统控制面板中有一个“SDSwitch”小程序,其主要功能是在存储卡和SDIO模式之间切换,但也有一个复选框来控制此选项。其他一些设备在\ Windows文件夹中有一个“密封的SD插槽”CAB文件 - 我似乎在MC65或ES400上记得这个。