3

我遇到了一些 Windows CE 5.0 设备的问题,这些设备在从待机(挂起)状态恢复后几乎立即崩溃。我已将问题压缩到大约 15 行 C++ 以简单地让 wxWidgets 显示一个消息框,如果我这样做,问题就会出现:

  1. 启动应用程序
  2. 暂停设备(我的意思是短暂按下红色电源按钮)
  3. 恢复设备
  4. 按消息框标题中的确定按钮。
  5. 繁荣

在我将其浓缩之前,这个问题以许多其他方式表现出来 - 在加载位图时,在扫描条形码时,一旦它被暂停,然后恢复。

我正在使用以下内容:

  1. Windows CE 5.0 Professional(摩托罗拉 MC3090 设备)(还有 WM 6.5 (MC55)、CE 6.0 (MC3190))
  2. 视觉工作室 2005 SP2
  3. wxWidgets 2.8.10
  4. Microsoft Windows CE 5.0 标准 SDK

显示的实际错误是零星的和广泛的,但主要是访问冲突,通常在函数调用的起始地址附近(通过挂起设备发现这一点,恢复然后在设备上附加 VS 调试器)。在对此做了大量的功课之后,我已经阅读了一些建议,这可能是某种堆损坏的发生。只要应用程序没有挂起,它就可以在所有正确的 SDK 和设备组合中正常运行。

我还尝试了以下 SDK:

  1. 微软掌上电脑 2003 SDK
  2. 用于 MC3000c50a 的 Symbol 平台 SDK
  3. 用于 MC3000c50b 的 Symbol 平台 SDK
  4. 视窗移动 5.0 SDK
  5. Windows Mobile 6.0 SDK

我已经测试了以下设备:

  1. MC3090 (Windows CE 5.0) - 同样的问题
  2. MC55 (Windows Mobile 6.5) - 同样的问题
  3. MC3190 (Windows CE 6.0) -使用 StandardSDK 构建的此设备上不会出现问题

我已经过度使用 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)

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

4

1 回答 1

2

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

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

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

于 2013-05-22T23:28:28.650 回答