更新: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 平台迁移开发人员常见问题)