November 11, 2006VC6 MFCをVC2005で[Computer]
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にリンクをするとアーキテクチャが違うとリンカに叱られて先に進みませんでした。 しかしシンボルが解決できないとリンカに文句を言われます。CWnd::KillTimer(unsigned int)が見つからないそうです。これまたGoogle先生に聞いてみると、新しいMFCではKillTimerの引数がintからunsigned intに変更されたとのこと。CodeGuruに同じ現象が書いてありました。こうなるのはPlatform SDKの新しいMFC用のヘッダに古いMFCのライブラリを組み合わせているからです。 BOOL KillTimer(UINT_PTR nIDEvent);
を BOOL KillTimer(INT_PTR nIDEvent);
と書き換えればOKでした。他にも似たようなトラブルがあるかもしれませんが、ヘッダ書き換えで対応できると思います。 これでうまくいきました。本格的にWindowsアプリケーションを一から作ろうとするとGUIエディタなどが重要になると思うので有償版Visual Studioを購入したほうが良いと思いますが、移植程度でしたら今回のようにお金を掛けずにもできます。 コメント
おお、すごいですね。僕も以前、挑戦したことのあるテーマでしたが、4000円でアカデミックパックが買えてしまうことに愕然として諦めたことがあります。 >odawaraさん コメントする
|
スポンサード リンク
|