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はまだ使えるしセキュリティも配慮されています。一度作ったコードは大事に継承し続けたいですね。