読者です 読者をやめる 読者になる 読者になる

kondoumh のブログ

- とあるソフトウェアエンジニアのめったに更新されないブログ -

Visual C++ 6.0 ⇒ Visual C++ 2005 へのプロジェクトの移行

Visual Studio C++

@ITで川俣 晶さんが、「いままたC++が熱い!「C++/CLI」として大進化したVisual C++ 2005」という記事を書いておられました。去年の夏の記事なんですね。見落としてました。業務でC++を使うこともめっきり少なくなりました。C++/CLIとか手を出してもよいかもしれません。


VC++6.0からVC++2005に移行するにあたり、私がやった作業(ごく小規模ですが)をメモします。

  • VC++ 6.0のdswファイルをVisual Studio 2005で開き、メッセージに従ってプロジェクトを変換する。
  • プロジェクトのビルドを行う。ここでは大抵エラーやワーニングが出るので、一つ一つ潰していく

まあこれだけなのですが、細かい修正点が何個かあります。

forループ内変数のスコープの仕様が変わっている。

これは、C++の仕様変化だと思いますが、forループでインクリメント用変数iを使用している場合、iのスコープはforループの中だけになっています。VC++6.0の時はforループを抜けてもiが再利用できました。

メッセージマップに指定するメソッドのシグネチャが違う

メッセージマップを自分で定義してメッセージハンドラを作成していた場合ですが、ハンドラ用メソッドのシグネチャが
 afx_msg void foo(UINT wParam, LONG lParam);
から
 afx_msg LRESULT foo(UINT wParam, LONG lParam);
のように変わっています。これによりreturn値を返す必要も出てきます。(この変化はVisual Studio 2002でもすでにありました。)

Cの標準関数をバッファオーバーラン対策されているものに置き換える

これもコンパイラが注意してくれるので片っ端から置き換えます。
 strcopy ⇒ stycopy_s
 sscanf ⇒ sscanf_s
など。引数にバイト数を入れなければいけないものもあります。

その他

細かい話ですが、MFCのCTreeCtrlのGetItemDataの挙動が変わっていました。引数にNULLが指定されると例外になります。VC++ 6.0では0が返ってきていました。引数がHTREEITEM型であるかをチェックしているようです。ちゃんと型チェックをしている人は問題ないはずですけど。

その他2

あるウィンドウクラスに、プロパティでメッセージハンドラを指定しようとしたら、「コード要素[クラス名]が読み取り専用のため追加・削除の操作ができません」とか言われてコード追加ができないという現象がありました。ファイルの読み取り属性などもチェックしたのですが原因がわからず、いったん問題のクラスのヘッダーファイル(.h)と定義ファイル(.cpp)をプロジェクトから削除し追加しなおすと問題なく操作できるようになりました。プロジェクト移行の際、何かの設定がおかしくなっていたのでしょう。

移行してみて

Visual C++ 2005(Visual Studio 2005)ですが、やはり少し動作が重たいですね。コンパイルにも時間がかかるようになりました。ただ、VC++6.0リリース当時の平均マシンスペックとIDEの進化を考えると、VC++2005は信じられないぐらい速いと思いますが。
ClassWizardがなくなり、他の言語同様プロパティでメッセージやイベントのハンドラを書くようになったのも大きな変化です。使いやすいのですぐ慣れるでしょうけど。