Visual C++ 6.0(VC6)時代の古いワークスペースファイル(.dsw)を現代の環境へ移行する(マイグレーション)際,いきなり最新環境で開くのではなく,中継地点として VC 8(VS2005)や VC 9(VS2008)などの環境を一度経由させる手順の備忘録です.
VC 6 は手軽にプロジェクトを作成でき,Windows 11 環境でも MFC42*.dll などが入っているため,単体テスト用のコンソールアプリ作成などにも未だ重宝します.しかし,VC 7(VS2002/2003)形式を通すと .vcproj を直接編集しないといけない状態になることがあるため,現在は VC 8 / VC 9 をゲートウェイとして活用しています.
プロジェクトのバックアップをしやすくするため,またVCのバージョンごとに出力先を切り分けるためのプロジェクトプロパティ設定と,移行時の注意点をまとめました.
1. ワークスペースの移行とプロパティのマクロ最適化
VC 6 で作成した MDI プロジェクト(プロジェクト名は5文字以下を推奨)の Test.dsw を,VC 8 で直接開いてソリューション(.sln)に変換します.
環境依存を排除し,かつバージョンごとに出力先を切り分けるため,プロパティ項目(出力ディレクトリや各出力ファイルパス)を一括で見直します.
■ 基本・出力パスの設定
- 全般 / 出力ディレクトリ:
c:\Temp\…\$(ProjectName)\$(ConfigurationName).080等に変更し,環境依存を排除します. - 全般 / 文字セット: 現代の標準である
Unicode 文字セットを使用するに変更します.
■ コンパイラ・リンカ関連の設定
- C/C++ / プリコンパイル済みヘッダ: プリコンパイル済みヘッダの出力パスを
$(IntDir)/$(TargetName).pchに最適化します. - C/C++ / 出力ファイル: 出力ファイルパスの競合を防ぐため
$(IntDir)/に指定します. - リンカー / 出力ファイル:
$(OutDir)/$(ProjectName).exeに書き換えます. - リンカー / 高級 / プログラムデータベースファイルの生成:
$(OutDir)/$(ProjectName).pdbに書き換えます. - ブラウザー情報 / 出力ファイル:
$(OutDir)/$(ProjectName).bscに書き換えます. - MIDL / 出力 / タイプライブラリ: ツリーにMIDLが表示されている場合は
$(IntDir)/$(ProjectName).tlbに変更します.
※設定後,それぞれの「コマンド ライン」項目で 060 のまま残っている箇所がないか確認してください.なお,.vcproj をエディタで直接開くと TypeLibraryName が古いパスのまま残っていることがあるため,その場合は $(IntDir)/$(ProjectName).tlb に修正します.
2. 移行時に直面するコンパイルエラー・警告の回避策
■ 'CWinApp::Enable3dControls' の警告 (C4996)
VC 8 でビルドすると,古い3Dコントロール関数が非推奨である旨の警告が出力されます.
- 対処法: 該当の呼び出し箇所を削除するか,あるいは
_MFC_VERマクロ(0x0700前後)を用いた適切なプリプロセッサ分岐によりコードを修正します.
■ 個人的によく変更する推奨プロパティ設定
- C/C++ / 言語 / OpenMP サポート:
はい (/openmp)に変更します. - リンカー / システム / 大きいサイズのアドレスの処理:
2GB を超えるアドレスをサポートする (/LARGEADDRESSAWARE)に変更します.
3. VC 9(VS2008)および VC 10(VS2010)以降への更新手順
変換後のファイルを別名で管理・スライドさせていくための手順です.
- VC 8 への変換完了後,
Test.slnとTest.vcprojをTest_80.slnとTest_80.vcprojとしてコピーし,.sln内の記述をエディタでTest_80.vcprojに書き換えて保存します. - VC 9 以降に更新する場合は,元の
Test.slnを開き,出力ディレクトリなどを…\$(ConfigurationName).090などに書き換え,同様にTest_90.*としてコピー保存していきます.
.vcproj 形式になっていれば,VC 10 以降(.vcxproj 形式)への変換も同様にスムーズに行うことが可能です.
■ VC 10 以降での注意点(MDI実行時エラーへの対処)
VC 10 以降でビルドした MDI アプリを起動した際,「引数が正しくありません。」というエラーが発生することがあります.
- 対処法:
InitInstanceの冒頭にAfxOleInit()の呼び出しを追加することで回避可能です.
各プロパティ設定画面のスクリーンショットと詳細解説
プロパティ設定の具体的なキャプチャ画像や,実験用の検証プロジェクト(Test0520.zip),フォルダの階層構造イメージ,および後続ステップとなる「VC2019/VC2022への移行」に関する詳細な検証データについては,私のブログにて画像付きで詳しく公開しています.
実際の画面を確認しながら確実にマイグレーションを進めたい方は,ぜひご参照ください.
詳細記事はこちら:VC6 から VC200x への移行 - IwaoDev