从 eVC 移植所带来的已知问题

可以借助多种 C++ 工具和资源,将现有的 Embedded Visual C++ 项目转换为 Visual Studio 2005。有关更多信息,请参见 eMbedded Visual C++ 到 Visual Studio 2005 升级向导

自 eVC 以来,活动模板库 (ATL)、Microsoft 基础类 (MFC) 和标准 C++ 库已更新和更改。 某些类不再受支持。请参见从 MFC 3.0 升级到 8.0 后不受支持的 eVC 类的列表。 调用这些类的代码需要先进行修改,然后才能在 Visual Studio 2005 中编译。 从 eVC 移植时通常会出现下列问题。

问题 说明/解决方法

对于 CE 3.0 以上的设备,不会在 MFC 中调用 CCeSocket::OnReceive() 方法。

有关详细解决方案,请访问以下网址:http://support.microsoft.com/default.aspx?scid=kb;zh-cn;253945

不支持 CArchive Class 类。

许多 eVC 项目包含对 CArchive Class 类的引用。 要解决此问题,需要移除对 CArchive 的引用。

某些集合类(包括 CObArray、CMapPtrToPtr 等等)是在 CE 5.0 中使用 CArray<>、CMap<> 等的模板化版本实现的。 在 Embedded Visual C++ 4.0 版和桌面 C++ 库中,这些类型是作为常规、非模板化的类实现的。 因此,对这些模板化的类调用 IMPLEMENT_SERIAL 会导致编译错误:

错误 C2039:“classCObArray”: 不是“CArray<TYPE,ARG_TYPE>”的成员。

错误 C2065:“classCObArray”: 未声明的标识符

若要解决实现中的此差异,请更改 IMPLEMENT_SERIAL 宏以使用 CObject,而不是 CObArray、CMapPtrToPtr 等等。

也就是说,请不要编写以下代码:

IMPLEMENT_SERIAL(CYourClass, CObArray, 0)

而使用以下代码:

IMPLEMENT_SERIAL(CYourClass, CObject, 0)

默认情况下,Embedded Visual C++ 4.0 版会将 MFC Pocket PC 应用程序的对话框样式设置为 DS_MODALFRAME。 MFC 8.0 不支持此样式。

示例

此节简要介绍一些更常见的错误,在将项目从 eMbedded Visual C++ 迁移到 Visual Studio 2005 时,可能会遇到这些错误。有关更多信息,请参见 Migrating Microsoft eMbedded Visual C++ Projects to Visual Studio 2005(将 Microsoft eMbedded Visual C++ 项目迁移到 Visual Studio 2005)

  • 编译错误:无法打开包含文件“wceres.rc”

    右击项目资源 (RC) 文件,选择“查看代码”,然后注释掉以下行:

    //#include "wceres.rc"
  • 未定义 NUM_TOOL_TIP

    在头文件中,为 Pocket PC 配置定义 #define _WIN32_WCE_PSPC,为 Smartphone 配置定义 _WIN32_WCE_WFSP

  • 无法打开 OLDNAMES.lib 文件

    在“解决方案资源管理器”中,右击项目文件,然后单击“属性”。

    单击“链接器”。 编辑“忽略特定库”属性,方法是添加 OLDNAMES.LIB

  • 重载不明确

    标准 C++ 库 (SCL) 和 ATL 具有同时存在于设备 SDK 中的 API。 使用诸如 :: 的命名空间消除歧义性。

  • 模块计算机类型“THUMB”与目标计算机类型“ARM”冲突

    在“解决方案资源管理器”中,右击项目文件,然后选择“属性”。

    在“配置属性”下,展开“链接器”,然后单击“命令行”属性。 对于每个 Windows Mobile 5.0 配置,在“属性”页中从命令行移除 /MACHINE:THUMB 开关。

  • 资源字符串未正确分隔

    您可能遇到未正确分隔来自所移植应用程序的资源字符串的问题。 在“解决方案资源管理器”中,右击项目文件,然后单击“属性”。 在“配置属性”下,展开“资源”,然后选择“命令行”属性。 将 -n 开关添加到资源编译器命令行中。

  • 对话框中需要 BEGIN 错误

    发生该错误后通常会发生“未找到文件”这类错误,例如,“找不到文件: 0x1”。 请转至错误所指示的 RC 文件,然后编辑代码以便在 FONT 声明前后使用 #ifdef 语句,如下面的代码示例所示。

    原来的代码:

    IDD_COMPTEST DIALOGEX 0, 0, 186, 95
        STYLE DS_SETFONT | WS_CHILD
        EXSTYLE WS_EX_CONTROLPARENT
        FONT 8, "MS Sans Serif", 0, 0, 0x1
        BEGIN
        END

    修改后的代码:

    IDD_COMPTEST DIALOGEX 0, 0, 186, 95
        STYLE DS_SETFONT | WS_CHILD
        EXSTYLE WS_EX_CONTROLPARENT
        #ifdef _WIN32_WCE
        FONT 8, "MS Sans Serif"
        #else
        FONT 8, "MS Sans Serif", 0, 0, 0x1
        #endif
        BEGIN
        END

请参见

posted @ 2008-12-10 20:15  张伟——程序员  阅读(321)  评论(0编辑  收藏  举报