從 eMbedded Visual C++ 移植的已知問題
更新:2007 年 11 月
有一些 C++ 工具和資源可協助您將現有的 eMbedded Visual C++ 專案轉換到 Visual Studio。如需詳細資訊,請參閱 eMbedded Visual C++ 至 Visual Studio 升級精靈。
自從引進 eMbedded Visual C++ 之後,Active Template Library (ATL)、Microsoft Foundation Class (MFC) 及 Standard C++ 程式庫都已經更新並進行過變更。如需不支援之類別清單,請參閱從 MFC 3.0 到 9.0 不支援之 eVC 類別的清單。您必須修改呼叫這些類別的程式碼,才能在 Visual Studio 中進行編譯。下列問題通常會在從 eMbedded Visual C++ 移植時發生。
問題 |
說明/解決方法 |
---|---|
如果是比 Windows CE 3.0 還要新的裝置,則無法在裝置 MFC 中呼叫 CCeSocket::OnReceive() 方法。 |
解決方法會在說明及支援知識庫文件中討論:Bug:無法對接受的資料通訊端呼叫 CCeSocket OnReceive() (英文)。 |
不支援 CArchive Class |
許多 eMbedded Visual C++ 專案都包含 CArchive Class 類別的參考。若要解決這個問題,您必須移除 CArchive 的參考。 |
某些集合類別 (Collection Class) (例如 CObArray、CMapPtrToPtr 等等),都會使用 CArray<>、CMap<> 等的範本版本在 Windows CE 5.0 中實作。在 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 時,可能會遭遇到的一些較為常見的錯誤。如需詳細資訊,請參閱從 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++ 程式庫 (Standard C++ Library,SCL) 和 ATL 所具有的 API 也都在裝置 SDK 中。應加上命名空間避免發生意義模糊不清的情況,例如 ::。
模組電腦類型 '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 升級精靈