Skip to content

MS_VCPlusPlusUpgrade

nishi_74322014 edited this page Aug 31, 2026 · 1 revision

VC++バージョンアップ

概要

  • 本ページでは、C ランタイム(CRT)や開発環境のバージョンアップに伴う
    Visual C++ プログラムのコンバージョン移行の作業範囲を扱います。

  • プラットフォーム移行に伴う環境移行、ポーティング移行については、
    Windows, IE移行64bit対応
    若しくは関連リンク中の関連項目(UNIX 移植など)を参照下さい。

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

詳細

CRTバージョンアップ

  • VC++ は、CRT のバージョンアップの際、.NET のようなバイナリレベルの
    後方互換により、
    旧バージョンで開発したプログラムが、
    新バージョンのランタイムで自動的に動作するということはありませんので、
    新しい開発環境を用意してプログラムをリビルドする必要があります。

  • また、スタティック・リンクする場合を除いて、CRT の再頒布が必要になります。

  • この際、プラットフォームが当該 CRT のバージョンをサポートするかどうかも確認して下さい。

  • このため、CRT バージョンアップ ≒ 開発環境のバージョンアップとなり、

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

    • ここで述べられていることを簡単に要約すると、

      「ファイル ハンドル、ロケール、環境変数などの CRT オブジェクト、
      new または malloc で明示的に、または strdupstrstreambuf::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 変更発生に起因する修正範囲拡大の可能性がありますので、
    その場合の移行作業は手修正有りのコンバージョン移行に近づきます。

CRTセキュリティ強化

  • 新しい開発環境では、バッファ オーバフローなどの脆弱性に対応した、
    _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 系関数へ置き換えていない箇所を実行時に洗い出せる
という利点がある。

マルチバイト文字セット(MBCS)の廃止

MFC は Unicode しかサポートしなくなるらしいので
VC++ 物のメンテナンスは、これから大変かもしれません。

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

補足(MBCS 廃止は撤回された): 本ページの懸念に反して、
MFC の MBCS サポートは廃止されず、現在も提供されている
VS 2013 では MBCS 版 MFC が別途ダウンロード扱いになったが、
VS 2015 以降は再び標準で同梱されている。
ただし、方向性としては Unicode(_UNICODE / UNICODE)が推奨であり、
新規開発や大規模改修の機会には Unicode 化しておくのが妥当という判断は変わらない。

関連リンク

MSDN > Visual Studio 2005 > Visual Studio ドキュメント

Visual C++

スマート デバイス開発 > Visual C++ を使用したプログラミング

MSDN > Visual Studio 2008 > Visual Studio ドキュメント

Visual C++(2008)

MSDN > Visual Studio 2010 > Visual Studio ドキュメント

Visual C++(2010)

XLsoft エクセルソフト > MKS Toolkit

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 の利用は「移植」ではなく
環境をそのまま持ち込む方向であり、
移行・コンバージョン方式
リホストに近い選択になる。

参考


Tags: 移行

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally