eMbedded Visual C++ からの移植に関する既知の問題
更新 : 2007 年 11 月
既存の eMbedded Visual C++ プロジェクトを Visual Studio に変換するのに役立つ、多くの C++ ツールおよびリソースが用意されています。詳細については、「eMbedded Visual C++ から Visual Studio へのアップグレード ウィザード」を参照してください。
ATL (Active Template Library)、MFC (Microsoft Foundation Classes)、および標準 C++ ライブラリは、eMbedded Visual C++ が導入されてから更新および変更されました。サポートされていないクラスの一覧については、「MFC 9.0 でサポートされなくなった MFC 3.0 の eVC クラスの一覧」を参照してください。これらのクラスを呼び出すコードは、変更して Visual Studio でコンパイルする必要があります。eMbedded Visual C++ から移植するときには、通常、以下の問題が発生します。
問題 |
説明/解決方法 |
---|---|
CCeSocket::OnReceive() メソッドは、Windows CE 3.0 より新しいデバイスの MFC では呼び出されません。 |
解決方法は、サポート技術情報の記事「Bug: CCeSocket OnReceive() does not get called for accepted data sockets」で解説されています。 |
CArchive クラス クラスはサポートされていません。 |
eMbedded Visual C++ プロジェクトの多くには、CArchive Class クラスの参照が含まれます。この問題を解決するには、CArchive の参照を削除する必要があります。 |
CObArray や CMapPtrToPtr など、特定のコレクション クラスは、対応するテンプレート クラス (CArray<>、CMap<> など) を使って Windows CE 5.0 に実装されています。eMbedded Visual C++ バージョン 4.0 およびデスクトップ C++ ライブラリでは、これらの型が通常のクラス (非テンプレート クラス) として実装されています。そのため、これらのテンプレート クラスで IMPLEMENT_SERIAL を呼び出すと、次のようなコンパイル エラーが発生します。 エラー C2039: 'classCObArray' : 'CArray<TYPE,ARG_TYPE>' のメンバではありません エラー C2065: 'classCObArray' : 定義されていない識別子です |
こうした実装の違いを解決するには、CObArray や CMapPtrToPtr などではなく、CObject を使用するように IMPLEMENT_SERIAL マクロを変更します。 たとえば、次のように記述するのは誤りです。 IMPLEMENT_SERIAL(CYourClass, CObArray, 0) これを次のように書き換えます。 IMPLEMENT_SERIAL(CYourClass, CObject, 0) |
既定では、eMbedded Visual C++ Version 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」を参照してください。
コンパイル エラー: インクルード ファイル '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 へのアップグレード ウィザード