-
Notifications
You must be signed in to change notification settings - Fork 0
MS_VCPlusPlusUpgrade
- 戻る(VC++、各種、技術毎の移行性)
- VC++バージョンアップ
-
本ページでは、C ランタイム(CRT)や開発環境のバージョンアップに伴う
Visual C++ プログラムのコンバージョン移行の作業範囲を扱います。 -
プラットフォーム移行に伴う環境移行、ポーティング移行については、
Windows, IE移行、64bit対応、
若しくは関連リンク中の関連項目(UNIX 移植など)を参照下さい。 -
また、移行見積もりに関しては、プログラムの移行性評価作業として、
1・2 本のプログラムをサンプリングし、
実際に移行 ~ テストをした上で、移行作業全体の工数を見積もることをお薦めします。
-
VC++ は、CRT のバージョンアップの際、.NET のようなバイナリレベルの
後方互換により、
旧バージョンで開発したプログラムが、
新バージョンのランタイムで自動的に動作するということはありませんので、
新しい開発環境を用意してプログラムをリビルドする必要があります。- 参考
- すらりん日記 » 現在のWindowsサイドバイサイドについて|No:2272
http://blog.techlab-xe.net/archives/2272 - すらりん日記 » 現在のWindowsサイドバイサイドについて-続き-|No:2281
http://blog.techlab-xe.net/archives/2281
- すらりん日記 » 現在のWindowsサイドバイサイドについて|No:2272
- 参考
-
また、スタティック・リンクする場合を除いて、CRT の再頒布が必要になります。
-
この際、プラットフォームが当該 CRT のバージョンをサポートするかどうかも確認して下さい。
-
このため、CRT バージョンアップ ≒ 開発環境のバージョンアップとなり、
-
CRT バージョンアップの注意事項として、関連リンクにもある、
「DLL の境界を越えて CRT オブジェクトを渡す場合に発生する可能性のあるエラー」のトピックがあります。-
ここで述べられていることを簡単に要約すると、
「ファイル ハンドル、ロケール、環境変数などの CRT オブジェクト、
newまたはmallocで明示的に、またはstrdup、strstreambuf::strなどで暗黙的に割り当てたメモリ ポインタを
DLL の境界を越えて(関数に)渡す場合、双方の CRT が異なるバージョン、実体(スタティック リンク)を
使用しているとプログラムが正しく動作しない可能性がある。」 -
ということですので、これを考慮して(DLL などのプロジェクトも移行範囲に含めるべきか)移行計画を決定する必要があります。
-
移行メモ(正誤): 元ページの「新バージョンのラインタイム」は「ランタイム」、
「DDLなどのプロジェクト」は「DLL などのプロジェクト」の誤記と判断し、修正した。
補足(VS 2015 以降は状況が変わった): 本ページが前提としている
「CRT バージョンアップ ≒ 開発環境のバージョンアップ」という関係は、
Visual Studio 2015 以降では緩和されている。
- VS 2015 で CRT が UCRT(Universal CRT) に再構成され、
UCRT は Windows のコンポーネントとして OS 側で提供されるようになった。- あわせて VS 2015 / 2017 / 2019 / 2022 の再頒布可能パッケージはバイナリ互換であり、
同一メジャー(VCRUNTIME140.dll系)でまとめて扱える。このため、VS 2015 以降どうしのバージョンアップでは、
本ページが述べるような「再頒布パッケージがバージョンごとに並ぶ」問題は
起きにくくなっている。
一方で、VS 2013 以前からの移行は依然として本ページの記述どおりであり、
上記の「DLL の境界を越えて CRT オブジェクトを渡す」問題も
異なるメジャー間では現在も有効な注意点である。
-
上記で説明したように、CRT のバージョンアップ ≒ 開発環境のバージョンアップとなります。
-
また、CRT や開発環境のバージョンアップに伴い、使用する 3rd パーティ製ライブラリの当該環境上でのサポートが無くなる場合、
代替ライブラリの I/F 変更発生に起因する修正範囲拡大の可能性がありますので、
その場合の移行作業は手修正有りのコンバージョン移行に近づきます。
-
新しい開発環境では、バッファ オーバフローなどの脆弱性に対応した、
_s("secure")のサフィックスの付与された新しい関数が用意されています。
この新関数にはインターフェイスに変更がありますので、旧関数から新関数に変更する作業は、
手修正有りのコンバージョン移行的なものになり、作業は容易ではありません。 -
このため、
#define _CRT_SECURE_NO_WARNINGSを定義して、
旧関数を使用した場合にコンパイラが出力する警告を無効にし、
CRT の新しい機能である「パラメータ検証」を使用することで対応するという方法もあります
(既存の多くの関数に対しても、関数に渡されるパラメータ検証に対する仕様が変更されている)。 -
この「パラメータ検証」により無効なパラメータが検出されると、
CRT は、現在割り当てられている「無効なパラメータ ハンドラ」を呼び出します。
このハンドラの既定の動作は、ワトソン博士(drwtsn32)のクラッシュ レポートを
起動させ、実行中のアプリケーションをクラッシュさせるものとなっています。 -
また、このハンドラの動作は、
_set_invalid_parameter_handler関数を使用することでカスタマイズできるので、
無効なパラメータが検出された場合に、アプリケーションを終了させずに、
アサートなどでこれらの問題をチェックするという処理を実装することも可能です。 -
詳細は関連リンク中の関連項目(CRT のセキュリティ強化など)を参照下さい。
移行メモ(正誤): 元ページの
CRT_SECURE_NO_WARNINGSは
先頭のアンダースコアが欠けており、正しくは_CRT_SECURE_NO_WARNINGSであるため修正した。
また、ワトソン博士の実行ファイル名もdtwtsn32ではなくdrwtsn32(Dr. Watson)であるため修正した。
補足(現在のクラッシュ レポート): ワトソン博士(
drwtsn32)は
Windows Vista 以降では廃止され、
Windows Error Reporting(WER) に置き換わっている。
したがって、現在の既定動作は「WER によるクラッシュ ダンプの採取とプロセス終了」となる。
本ページが推奨する_set_invalid_parameter_handlerによるハンドラ差し替えは
現在も有効な手法で、移行の初期段階で仕込んでおくと、
_s系関数へ置き換えていない箇所を実行時に洗い出せるという利点がある。
MFC は Unicode しかサポートしなくなるらしいので
VC++ 物のメンテナンスは、これから大変かもしれません。
- 警告を消すだけなら、
#define NO_WARN_MBCS_MFC_DEPRECATIONの 1 つ追加でできる。 - しかし実際は、
\0や バッファ長の処理をうまく書き換える必要がある。
補足(MBCS 廃止は撤回された): 本ページの懸念に反して、
MFC の MBCS サポートは廃止されず、現在も提供されている。
VS 2013 では MBCS 版 MFC が別途ダウンロード扱いになったが、
VS 2015 以降は再び標準で同梱されている。
ただし、方向性としては Unicode(_UNICODE/UNICODE)が推奨であり、
新規開発や大規模改修の機会には Unicode 化しておくのが妥当という判断は変わらない。
-
概要
-
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
- 新しい CRT 機能
- 開発環境の新機能 (C++)
http://msdn.microsoft.com/ja-jp/library/6db3z985.aspx - Visual C++ コンパイラ、言語、およびツールの新機能
http://msdn.microsoft.com/ja-jp/library/f0tby9k9.aspx
- Visual C++ ライブラリの新機能
-
前の製品の変更点
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
- ATL と MFC における変更点
- Visual C++ のバージョン間の製品の変更点
-
-
リファレンス > ライブラリ リファレンス > ランタイム ライブラリ
-
C ランタイム ライブラリ
http://msdn.microsoft.com/ja-jp/library/abx4dbyh.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.aspxCRT が無効な引数を検出した場合に呼び出す関数を設定する。
<参考>
●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変更の概略、言語キーワード、マネージ型、クラスまたはインターフェイス内でのメンバ宣言、値型とその動作、言語の変更の概要
-
- UNIX から Win32 への移植
- 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
- eMbedded Visual C++ から Visual Studio 2005 へのアップグレード ウィザード
- 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
- 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
- Visual C++ 2008 での互換性に影響する変更点
http://www.xlsoft.com/jp/products/mks/index.html
-
UNIX コマンドを Windows で実行
-
MKS Toolkit 製品を使用することによって、
UNIX から Windows ベースのワークステーションおよびサーバーへ移行する際に、
既存の UNIX ソフトウェア資産および知識を有効活用することができます。 -
MKS Toolkit 製品は、UNIX プラットフォームのスクリプト、ソースコード
および動作環境を簡単に Windows プラットフォームに統合します。
-
補足(UNIX → Windows 移植の現在の選択肢): MKS Toolkit のような
ソース互換性サブシステムに代わって、現在は
WSL(Linux バイナリをそのまま動かす)や
vcpkg(POSIX 系ライブラリの Windows ビルドを取得する)が
使われることが多い。
本ページの整理で言えば、WSL の利用は「移植」ではなく
環境をそのまま持ち込む方向であり、
移行・コンバージョン方式の
リホストに近い選択になる。
- 本 Wiki 内
Tags: 移行
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。