November 11, 2006

VC6 MFCをVC2005で

Visual Studio 6で作成したWindowsアプリケーション(MFC使用)をVisual Studio 2005 Express Editionでコンパイルできるように移植するという用件がやってきました。VC2005でVC6のプロジェクトを開くとある程度自動的にコンバートしてくれますが、いくつか修正する必要があったのでメモを残しておこうと思います。加えて、たまたまこの作業を行ったPCにVC6がインストールされていなかったのでVC6無しでWindowsアプリケーション(MFC)のコンパイル環境を構築してみました。

VC2005 Express Editionですが、以前の記事でも書いたとおり無償なので、機能制限がそれなりにあります。コマンドライン上で動く単純なCUIアプリケーションならば全く問題ないのですが、今回のようにWindowsのGUIアプリケーションとなると色々と技を駆使しないとコンパイルできませんでした。

まずはWindows Platform SDKの導入です。Platform SDKはWindowsアプリケーションを作成する際に必要となるヘッダやライブラリなどがある程度の範囲で無償公開されているものです。Windows Server 2003 R2 Platform SDKをインストールして、プロジェクトのインクルードパスに(Platform SDKのインストールディレクトリ)¥Include、¥Include\mfc、¥Include\atlを、ライブラリパスに¥Libを追加しておきます。Microsoftの解説ページが参考になると思います。

この状態でビルドを試みると、リンクの際にライブラリmfc42d.libがないと言われてしまいます。MFCにはバージョンがいくつかあり、これはVC6時代のMFCのようです。Google先生を検索したところ、Visual Studio 2005の有償版を持っている場合は新しいバージョンのMFCに切り替えてコンパイルできるようにする方法(『MFCアプリをVC6からVS2005へ移植時にリンクエラー』参考)があるようですが、今回は有償版VC2005もVC6もないのでネットからこれらのライブラリを探してきます。MFCがPlatform SDKに含まれているような雰囲気も漂っていますが、実はIA64用でx86用は含まれていません。Platform SDKのIA64用MFCにリンクをするとアーキテクチャが違うとリンカに叱られて先に進みませんでした。
このMFC42系のライブラリですが、VC6のサービスパックに含まれています。Visual Studio 6 Service Pack 6をダウンロードしてきて実行後にできるVS6sp62.cabの中に含まれているので、必要なライブラリをプロジェクトと同じディレクトリにコピーしておきます。これでライブラリがないとは言われなくなりました。

しかしシンボルが解決できないとリンカに文句を言われます。CWnd::KillTimer(unsigned int)が見つからないそうです。これまたGoogle先生に聞いてみると、新しいMFCではKillTimerの引数がintからunsigned intに変更されたとのこと。CodeGuruに同じ現象が書いてありました。こうなるのはPlatform SDKの新しいMFC用のヘッダに古いMFCのライブラリを組み合わせているからです。
解決方法はPlatform SDKのInclude¥mfc¥afxwin.hの2113行目を書き換えます。

BOOL KillTimer(UINT_PTR nIDEvent);

BOOL KillTimer(INT_PTR nIDEvent);

と書き換えればOKでした。他にも似たようなトラブルがあるかもしれませんが、ヘッダ書き換えで対応できると思います。

これでうまくいきました。本格的にWindowsアプリケーションを一から作ろうとするとGUIエディタなどが重要になると思うので有償版Visual Studioを購入したほうが良いと思いますが、移植程度でしたら今回のようにお金を掛けずにもできます。

20:52 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/529
コメント

おお、すごいですね。僕も以前、挑戦したことのあるテーマでしたが、4000円でアカデミックパックが買えてしまうことに愕然として諦めたことがあります。
買いましょうよ(^^;

Posted by: odawara : November 12, 2006 12:56 PM

>odawaraさん
そうですよね(笑) 色々調べるのに3時間くらいかかったんで、時給換算で全然変えてしまう辺りがなんとも…

Posted by: fenrir : November 12, 2006 01:52 PM
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。