从 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