VC++6 のアプリは、インストーラレスで動作させることができるため、今日でも需要があります。しかしIDEの機能が低いため、開発効率は低いです。そこで弊方では、一度Visual Studio 2019 にコンバートして開発し、最後にVC++6で検証してリリースしています。その時のポイントの覚書です。
Visual Studio 2019 の設定
VC++6の頃は.NETはまだなく、標準ライブラリは MFC でした。Visual Studio 2022となった現在でもサポートされています。2000年当時、現在も名だたる数々のアプリが作成されました。オプション機能になっいるので、以下のようにオプション追加します。尚、無償版ではサポートされていません。
Projectのコンバート
vc++6 のproject file : .dsp か .dsw を、Visual Studio 2019 で開きます。後は、質問に答えていけば完了です。.sln と .vcxproj が生成されます。
コードの修正
C++ のコンパイラ仕様がやや特殊であったため、(汚いコードを書いていると)修正が必要になります。
【違い1】 VC++6では関数/method内で宣言した変数は、その後スコープを跨いで使用可能となっている。
具体的には、
void founcA( )
{
for( int i = 0; i < 10; i ++ ) {
.....
}
for( i = 0; i < 20; i ++ ) { /* VC++6ではOK、VS2019とC++一般ではNG */
.....
}
}
【違い2】 VC++6ではcastしなくても、引数の型に合わせてくれる。
具体的には、
void funcA( int x, int y )
{
....
}
void funcB( )
LONG y1;
...
funcA( 100, y1 ); /* VC++6ではOK、VS2019とC++一般ではNG */
数値だけでなく、char[]と CString 間でも暗黙castされているので要注意です。数値を表示用に文字として扱う場合も同様です。
【違い3】 VC++6では関数/method型を宣言しないと、intとして扱われる。
具体的には、
virtual CString methodA();
virtual methodB(); /* VC++6ではint扱いでOK、VS2019とC++一般ではNG */
また strcpy系の関数にて以下の警告がでますが、領域外の上限をコード内で実装していれば問題ないので許容します。
Build設定の変更
Debug ビルドで以下のエラーが出る場合があります。
“/Gy-” は “Gy”オプション無し の意です。 以下のように有効にします。オプションの意味合い上、実害はないでしょう。
以上これでコンバートでlinkageまでとおります。これで.NETのC++並みのデバッグ機能が使用できるようになります。最近のVisual Studioのプラグインも使用できます。
ただし生成されたexeを他PCで実行する場合は、各Visual Studio バージョンに対応した VC++再配布可能ライブラリ が必要です。mfc42.dll では動きません。
最後に一言、.NETアプリでないと「セキュリティが!!」と怒り狂う方や、.NETコンバートを強く勧めるベンダーさんももいらっしゃいますが、MFCはまだ使えるしセキュリティも配慮されています。一度作ったコードは大事に継承し続けたいですね。ただ VC++ 6の入手/環境作りがネックです。
VC++ 6のコードを最新に移植したいが手がたりない、自身がない、担当者がいなくなったなどお困りの方は、こちらよりご相談ください。
その他:VC2019 から VC++6 で正式Buildする時
ターゲットがVC++6で、VC2019でクロス開発するとき、VC++6で正式Buildするときの注意です。
- bool と BOOL の違いがチェックされ、合わない場合、警告になります。TRUE/true、FALSE/false も同じ。
- MFCでWin32APIを使うとき、MFCのライブラリを参照しないよう 「::API名」と記述しますが、効かない場合あり。
- Win32APIを使うとき、対応する .h を 明示的 include しないとエラーになる。 VC2019ではいい塩梅にひっぱってきてくれる模様。(もしくは .h の構造がちがう)
- Win32APIを使うとき、対応する .lib を 明示的 にリンク指定しないとエラーになる。 VC2019ではいい塩梅にひっぱってきてくれる模様。