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 へのアップグレード ウィザード

その他の技術情報

Windows Mobile Platform Migration FAQ for Developers