从 eMbedded Visual C++ 进行移植的已知问题

更新:2007 年 11 月

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

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

问题

说明/解决办法

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

解决办法在帮助和支持知识库文章:Bug: CCeSocket OnReceive() does not get called for accepted data sockets(Bug:对于已接受的数据套接字不调用 CCeSocket OnReceive())中讨论。

不支持 CArchive Class 类。

很多 eMbedded Visual C++ 项目包含对 CArchive Class 类的引用。为了解决此问题,必须移除对 CArchive 的引用。

某些集合类(如 CObArray、CMapPtrToPtr 等等)在 Windows 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 9.0 不支持此样式。

示例

此节概述了在将项目从 eMbedded Visual C++ 迁移到 Visual Studio 时可能遇到的某些更为常见的错误。有关更多信息,请参见 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
    

请参见

概念

eMbedded Visual C++ 到 Visual Studio 升级向导

其他资源

Windows Mobile Platform Migration FAQ for Developers(Windows Mobile 平台迁移开发人员常见问题)