[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]

-[[戻る>移行・マイグレーション]]

* 目次 [#n359b1a7]
#contents

*概要 [#t55901c9]
-本ページでは、Cランタイム(CRT)や開発環境のバージョンアップに伴う Visual C++プログラムのコンバージョン移行の作業範囲を扱います。~
プラットフォーム移行に伴う環境移行、ポーティング移行については、 [[Windows, IE移行]]、 [[64bit対応]]、 若しくは、関連リンク中の関連項目(UNIX移植など)を参照下さい。

-また、移行見積もりに関しては、プログラムの移行性評価作業として、1・2本のプログラムをサンプリングし、実際に移行~テストをした上で、移行作業全体の工数を見積もることをお薦めします。

*CRTバージョンアップ [#m4e62710]
-VC++は、CRTのバージョンアップの際、.NETのようなバイナリレベルの[[後方互換>http://ja.wikipedia.org/wiki/%E5%BE%8C%E6%96%B9%E4%BA%92%E6%8F%9B]]により、 旧バージョンで開発したプログラムが、新バージョンのラインタイムで自動的に動作するということはありませんので、新しい開発環境を用意してプログラムをリビルドする必要があります。 また、スタティック・リンクする場合を除いて、CRTの再頒布が必要になります。この際、プラットフォームが当該CRTのバージョンをサポートするかどうかも確認して下さい。

-このため、CRTバージョンアップ ≒ 開発環境のバージョンアップとなり、移行に必要となる作業は、コンバージョン移行的なものになります。 このコンバージョンは、.NETと同様にVSに付属の[[変換ツール>http://msdn.microsoft.com/ja-jp/library/60z6y467.aspx]]で変換を行います。

-CRTバージョンアップの注意事項として、関連リンクにもある、「DLL の境界を越えて CRT オブジェクトを渡す場合に発生する可能性のあるエラー」のトピックがあります。ここで述べられていることを簡単に要約すると、

--「ファイル ハンドル、ロケール、環境変数などのCRTオブジェクト、newまたはmallocで明示的に、またはstrdup、strstreambuf::strなどで暗黙的に割り当てたメモリ ポインタを DLLの境界を越えて(関数に)渡す場合、双方のCRTが異なるバージョン、実体(スタティック リンク)を使用しているとプログラムが正しく動作しない可能性がある。」

-ということですので、これを考慮して(DDLなどのプロジェクトも移行範囲に含めるべきか)移行計画を決定する必要があります。

*開発環境のバージョンアップ [#q33b5c5d]
上記で説明したように、CRTのバージョンアップ ≒ 開発環境のバージョンアップとなります。

また、CRTや開発環境のバージョンアップのバージョンアップに伴い、 使用する3rdパーティ製ライブラリの当該環境上でのサポートが無くなる場合、代替ライブラリのI/F変更発生に起因する修正範囲拡大の可能性があります ので、その場合の移行作業は手修正有りのコンバージョン移行に近づきます。 

*CRTセキュリティ強化 [#t697e5f8]
-新しい開発環境では、バッファ オーバフローなどの脆弱性に対応した、_s ("secure") のサフィックスの付与された新しい関数が用意されています。 この新関数にはインターフェイスに変更がありますので、旧関数から新関数に変更する作業は、手修正有りのコンバージョン移行的なものになり、作業は容易ではありません。

-このため、「#define CRT_SECURE_NO_WARNINGS」を定義して、旧関数を使用した場合にコンパイラが出力する警告を無効にし、CRTの新しい機能である 「パラメータ検証」を使用することで対応するという方法もあります(既存の多くの関数に対しても、関数に渡されるパラメータ検証に対する仕様が変更されている)。

-この「パラメータ検証」により無効なパラメータが検出されると、CRTは、現在割り当てられている「無効なパラメータ ハンドラ」を呼び出します。 このハンドラの既定の動作は、ワトソン博士(dtwtsn32)のクラッシュ レポートを起動させ、実行中のアプリケーションをクラッシュさせるものとなっています。

-また、このハンドラの動作は、「_set_invalid_parameter_handler」関数を使用することでカスタマイズできるので、 無効なパラメータが検出された場合に、アプリケーションを終了させずに、アサートなどでこれらの問題をチェックするという処理を実装することも可能です。

-詳細は関連リンク中の関連項目(CRT のセキュリティ強化など)を参照下さい。

*マルチバイト文字セット(MBCS)の廃止 [#z218b3d0]
MFC は Unicode しかサポートしなくなるらしいので~
VC++物のメンテナンスは、これから大変かもしれません。

-警告を消すだけなら、#define NO_WARN_MBCS_MFC_DEPRECATIONの1つ追加でできる。
-しかし実際は、\0 や バッファ長の処理をうまく書き換える必要がある。

*関連リンク [#t0ed9bf2]
 MSDN > Visual Studio 2005 > Visual Studio ドキュメント
   - Visual C++
     - 概要
       - Visual C++ の新機能
         http://msdn.microsoft.com/ja-jp/library/bw65k95a.aspx
         - Visual C++ ライブラリの新機能
           http://msdn.microsoft.com/ja-jp/library/y8bt6w34.aspx
           - 新しい CRT 機能
           http://msdn.microsoft.com/ja-jp/library/ms235429.aspx
           - MFC と ATL の新機能
           http://msdn.microsoft.com/ja-jp/library/ms235433.aspx
           - 標準 C++ ライブラリの新機能
           http://msdn.microsoft.com/ja-jp/library/ms235424.aspx
           - 新しい C++ サポート ライブラリ
           http://msdn.microsoft.com/ja-jp/library/ms235430.aspx
           
         - 開発環境の新機能 (C++)
           http://msdn.microsoft.com/ja-jp/library/6db3z985.aspx
         - Visual C++ コンパイラ、言語、およびツールの新機能
           http://msdn.microsoft.com/ja-jp/library/f0tby9k9.aspx
           
       - 前の製品の変更点
         http://msdn.microsoft.com/ja-jp/library/686cfhy4.aspx
         - Visual C++ のバージョン間の製品の変更点
           http://msdn.microsoft.com/ja-jp/library/6sct1kww.aspx
           - Visual C++ .NET 2003
           - Visual C++ .NET 2002
           - Visual C++ 6.0 の既定のショートカット キー
           - Visual C++ 2.0 の既定のショートカット キー
         
         - Visual C++ のバージョン間のライブラリの変更点
           http://msdn.microsoft.com/ja-jp/library/5b7s2y1z.aspx
           - ATL と MFC における変更点
             http://msdn.microsoft.com/ja-jp/library/y4wwyyk7.aspx
           - 標準 C++ ライブラリの変更点
             http://msdn.microsoft.com/ja-jp/library/hft11816.aspx]
             
     - リファレンス > ライブラリ リファレンス
       - ランタイム ライブラリ
         - C ランタイム ライブラリ
           http://msdn.microsoft.com/ja-jp/library/abx4dbyh.aspx
           - 互換性に影響する変更点
             http://msdn.microsoft.com/ja-jp/library/ms235497.aspx
           - 互換性
             http://msdn.microsoft.com/ja-jp/library/sk54f3f5.aspx
             - 下位互換性
               http://msdn.microsoft.com/ja-jp/library/1zebz5fw.aspx
             - ANSI C 準拠
               http://msdn.microsoft.com/ja-jp/library/45aft37a.aspx
             - UNIX
               http://msdn.microsoft.com/ja-jp/library/77859s1t.aspx
             - Win32 プラットフォーム
               http://msdn.microsoft.com/ja-jp/library/ws0swas0.aspx
               
           - CRT のセキュリティ強化
             http://msdn.microsoft.com/ja-jp/library/8ef0s5kh.aspx
             - CRT 関数のセキュリティが強化されたバージョン
               http://msdn.microsoft.com/ja-jp/library/wd3wzwts.aspx
             - パラメータの検証
               http://msdn.microsoft.com/ja-jp/library/ksazx244.aspx
               - _set_invalid_parameter_handler
                 http://msdn.microsoft.com/ja-jp/library/a9yf33zb.aspx
                   CRTが無効な引数を検出した場合に呼び出す関数を設定する。
                   <参考>
                   errno、_doserrno、_sys_errlist、および _sys_nerr
                   http://msdn.microsoft.com/ja-jp/library/t3ayayh1.aspx
                   _CrtSetReportMode
                   http://msdn.microsoft.com/ja-jp/library/1y71x448.aspx
 
             - セキュリティ保護されたテンプレート オーバーロード
               http://msdn.microsoft.com/ja-jp/library/ms175759.aspx
 
           - DLL の境界を越えて CRT オブジェクトを渡す場合に発生する可能性のあるエラー
             http://msdn.microsoft.com/ja-jp/library/ms235460.aspx
           
         - カテゴリ別ランタイム ルーチン
           - 使用を推奨されていない CRT 関数
             http://msdn.microsoft.com/ja-jp/library/ms235384.aspx
             
         - ATL > 互換性に影響する変更点 (ATL)
           http://msdn.microsoft.com/ja-jp/library/ms235654.aspx
         - ATL/MFC > 互換性に影響する変更点 (ATL/MFC)
           http://msdn.microsoft.com/ja-jp/library/ms237326.aspx
         - ATL Server > 互換性に影響する変更点 (ATL Server)
           http://msdn.microsoft.com/ja-jp/library/ms241172.aspx
         - MFC > 互換性に影響する変更点 (MFC)
           http://msdn.microsoft.com/ja-jp/library/ms244941.aspx
         - 標準 C++ ライブラリ > 互換性に影響する変更点 (標準 C++ ライブラリ)
           http://msdn.microsoft.com/ja-jp/library/aa985946.aspx
     
     - プログラムの移植とアップグレード
       http://msdn.microsoft.com/ja-jp/library/7hfabkez.aspx
       - UNIX から Win32 への移植
         http://msdn.microsoft.com/ja-jp/library/y23kc048.aspx
       - 方法 : 以前のバージョンの Visual C++ からプロジェクトをアップグレードする
         http://msdn.microsoft.com/ja-jp/library/kyb7zzw4.aspx
       - マネージ拡張、C++/CLI 移行
         - C++ 構文のマネージ拡張のアップグレード チェックリスト
           http://msdn.microsoft.com/ja-jp/library/b23b94s7.aspx
         - 方法 : ウィザードで生成された C++ コードのマネージ拡張をアップグレードする
           http://msdn.microsoft.com/ja-jp/library/ms173356.aspx
         - C++/CLI 移行ガイド
           http://msdn.microsoft.com/ja-jp/library/ms235289.aspx
             変更の概略、言語キーワード、マネージ型、
             クラスまたはインターフェイス内でのメンバ宣言、
             値型とその動作、言語の変更の概要
 
   - スマート デバイス開発 > Visual C++ を使用したプログラミング
     - Visual C++ デバイス プロジェクトの作成と移植
       http://msdn.microsoft.com/ja-jp/library/w63478e0.aspx
       - eMbedded Visual C++ から Visual Studio 2005 へのアップグレード ウィザード
         http://msdn.microsoft.com/ja-jp/library/ms228806.aspx
       - eVC からの移植に関する既知の問題
         http://msdn.microsoft.com/ja-jp/library/ms228698.aspx
       - ネイティブ デバイス プロジェクトで対象となる複数のプラットフォーム
         http://msdn.microsoft.com/ja-jp/library/ms180753.aspx
         - 方法 : ウィザードを使用してマルチプラットフォーム対応のデバイス プロジェクトを作成する
           http://msdn.microsoft.com/ja-jp/library/ms228699.aspx
         - 方法 : 新しいプラットフォームをデバイス プロジェクトに追加する
           http://msdn.microsoft.com/ja-jp/library/ms228844.aspx
 
 - MSDN > Visual Studio 2008 > Visual Studio ドキュメント
   - Visual C++
     - Visual C++ 2008 の新機能
       http://msdn.microsoft.com/ja-jp/library/bb384632.aspx
     - 互換性に影響する変更点
       http://msdn.microsoft.com/ja-jp/library/bb531344.aspx
     - 前の製品の変更点
       http://msdn.microsoft.com/ja-jp/library/686cfhy4.aspx
       - Visual C++ 2005 とそれ以前のエディションの変更点
         http://msdn.microsoft.com/ja-jp/library/bw65k95a.aspx
       - Visual C++ のバージョン間の製品の変更点
         http://msdn.microsoft.com/ja-jp/library/6sct1kww.aspx
       - Visual C++ のバージョン間のライブラリの変更点
         http://msdn.microsoft.com/ja-jp/library/5b7s2y1z.aspx
 
 - MSDN > Visual Studio 2010 > Visual Studio ドキュメント
   - Visual C++
     - Visual C++ 2010 の新機能
       http://msdn.microsoft.com/ja-jp/library/dd465215.aspx
     - Visual C++ での互換性に影響する変更点
       http://msdn.microsoft.com/ja-jp/library/bb531344.aspx
     - 前の製品の変更点
       http://msdn.microsoft.com/ja-jp/library/686cfhy4.aspx
       - Visual C++ 2008 での互換性に影響する変更点
         http://msdn.microsoft.com/ja-jp/library/dd695830.aspx
       - Visual C++ のバージョン間の製品の変更点
         http://msdn.microsoft.com/ja-jp/library/6sct1kww.aspx
         
 - XLsoft エクセルソフト > MKS Toolkit
   http://www.xlsoft.com/jp/products/mks/index.html
  
     UNIX コマンドを Windows で実行
      
        MKS Toolkit 製品を使用することによって、
        UNIX から Windows ベースのワークステーションおよびサーバーへ移行する際に、
        既存の UNIX ソフトウェア資産および知識を有効活用することができます。
 
        MKS Toolkit 製品は、UNIX プラットフォームのスクリプト、ソースコード
        および動作環境を簡単に Windows プラットフォームに統合します。

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS