VC++6 を VS2019 にコンバート時のポイント

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です