Microsoft Foundation Class (MFC) について
Microsoft Foundation Class (MFC) は、
マイクロソフトがVisual
C++向けに開発した、Windows
アプリケーションソフトウェア構築のための強力なアプリケーションフレームワーク(クラス
ライブラリ)です。Active Template Library (ATL) と並び、Visual Studioに統合されており、Windowsアプリケーション開発を大幅に効率化します。
概要
MFCは、Windowsアプリケーションの基本的な要素を包括的に提供します。メッセージハンドラ、ウィンドウフレームワーク、GDIオブジェクト、デバイスコンテキスト、スレッド、ソケット、FTP/HTTPなどのインターネットサービス、可変長
文字列、
配列やリストなどのコンテナクラスが含まれます。これにより、開発者はWindows APIを直接呼び出す手間を大幅に削減でき、Visual
C++の統合環境との親和性も高く、開発が容易になります。しかし、MFCに過度に依存したプログラムは、他の
オペレーティングシステム (OS) への移植が難しくなるという課題も抱えています。
MFCに類似する
ライブラリとして、Windows Template Library (WTL) が存在します。
歴史
MFCは
1992年に、
16ビット版Windowsを対象として、
マイクロソフトのC/
C++コンパイラ7.0と共に登場しました。これは、開発ツール市場でのシェア拡大を目指す
マイクロソフトの戦略の一環であり、
C++言語の能力を広く示すことを目的としていました。当時、
C++は商用アプリケーション開発においてCからの移行期にあり、C/
C++ 7.0は
マイクロソフト初の
C++対応
コンパイラでした。MFCは、MacintoshのThink Class Library (TCL) から大きな影響を受け、その構造の多くをTCLから継承しました。
同時期には、
ボーランドからObject Windows Library (OWL) が競合製品として登場しました。OWLは、より厳密に
オブジェクト指向に準拠した設計で、一時的にMFCよりも高い評価を得ていましたが、Windowsへの機能追加とOWLのアップデートに時間差が生じたため、シェアを失いました。
Visual
C++ 4.2では、WinInetや
ActiveXなどのインターネット関連クラスが追加されました。Visual
C++ 7.0 (Visual
C++ .NET 2002) では、MFCとATLの一部が統合されましたが、大きな変化はありませんでした。しかし、Visual
C++ 2008 (Visual Studio 2008) のサービスパック1で導入された「MFC Feature Pack」により、MFCは大幅に進化しました。Office 2007風のリボンインターフェースを構築するクラスや、Visual Studio 2005風のドッキングウィンドウを実現するクラスなど、100以上のクラスが追加されました。これらのクラスを利用するには、Feature Packインストール後にMFCアプリケーションウィザードに追加されたテンプレートを使用します。ただし、
.NET Frameworkの開発とは異なり、GUIはコードベースで構築する必要があるため、MFCプログラミングの深い理解が不可欠です。
Windows 7 SDKには「リボンフレームワーク」と呼ばれるAPI群も存在しますが、これはCOMコンポーネントを利用したAPIプログラミングであり、MFCはネイティブなリボンUIアプリケーション開発において依然として有力な選択肢となります。
Visual
C++ 2010 (Visual Studio 2010) では、リボンUIを視覚的に編集できるリボンデザイナーが追加されました。また、Windows Vista以降のタスクダイアログや再起動マネージャーを利用する機能、高DPI環境への標準対応も実装されました。Visual
C++ 2010のサービスパック1では、Direct2DラッパーとWindows Animation Managerラッパーの機能も追加されました。
Visual
C++ 2015では、動的レイアウトへの対応など、
.NET Frameworkとは異なる方向で機能拡張が継続されています。
仕様
MFCは、初期にはマクロを多用して
C++の構文を拡張し、Windowsメッセージ、例外処理、実行時型情報、クラスの動的インスタンス化などを管理していました。メッセージ処理にマクロを使用したことで、仮想関数テーブルの使用を避け、メモリ消費を抑制する狙いがありました。また、Visual
C++のツールによるコード解析も容易になりました。しかし、一部のマクロは型チェックを無効化し、バグの原因となることもありました。
MFCの主な利点は、Windows APIを利用したプログラム開発に
オブジェクト指向プログラミングモデルを導入できることです。また、Windowsリソースに関連するデータ型のラッパーを提供し、リソースの自動解放 (RAII) を実現します。さらに、Model View Controller (MVC) モデルに基づいたドキュメント/ビューフレームワークも提供します。
マイクロソフトは
C++標準化において多重継承に否定的な立場を取っていたため、初期のMFCでは多重継承は使用されていませんでした。オブジェクトの機能は基底クラスに、実装は単純継承によって行われ、クラスが不必要に肥大化することを避けていました。しかし、一部のクラスは多重継承で実装されるべきものが単純継承で実装され、開発を難解にしています。
MFCの主な欠点は、多くのOSで利用できないことです。Mainsoftが
UNIX版MFCツールを開発しましたが、
マイクロソフトは1990年代にMacintosh版MFCを販売した後、MacintoshへのVisual Studioのサポートを中止しました。
また、MFC
ライブラリはバージョンごとにメモリ管理が異なるため、異なるバージョンのMFCを使用したEXE-DLL間でオブジェクトをやり取りすると、バイナリレベルの互換性問題が発生します。そのため、旧バージョンのMFCで開発されたDLLを新バージョンのMFCアプリケーションで利用するには、再ビルドが必要です。MFCを使わないアプリケーションからMFCのコードを利用する場合は、
C言語関数形式のインターフェースやCOMインターフェースを作成する必要があります。
MFCは、生産性においてVisual BasicやVisual C#などのRADツールに劣ります。また、
C++の学習コストも高いため、エンドユーザープログラミングには不向きです。しかし、実行速度やプラットフォーム、開発環境の変更コストの問題から、多くの企業やプログラマーがMFCを利用し続けています。Windows APIやCOMコンポーネントを直接操作する方が効率的な場合もあり、これらの技術と親和性の高いMFCが選ばれることがあります。
Visual
C++ .NET以降では、マネージ拡張
C++や
C++/CLIを用いて、MFCアプリケーションから
.NET Frameworkの
ライブラリを利用したり、MFCのネイティブコードをマネージコードでラップしたりできます。これにより、ネイティブコードとマネージコードの資産を共に活用できますが、開発難易度は高くなります。
MFCの欠点に対する批判
`CDocument`や`CView`などの基本的なクラスの仕様が難解である。Win32 APIの基本知識が前提となる。
クラスは単一継承のみで階層が深くなりがちで、`friend`クラスの多用により直交性が低い。
グローバル名前空間にすべての関数、構造体、クラスが存在し、マクロが多用されているため、名前の衝突が発生しやすい。
実行時型情報や例外処理は独自のマクロで実装され、標準
C++との統一感がない。
変数名に古いハンガリアン記法が用いられ、現代のコーディングスタイルに合わない。
Win32 API自体の統一性が低いため、薄いラッパーであるMFCでもそれを隠蔽しきれない。
`DEBUG_NEW`マクロによる`new`キーワードの置換など、標準規格に違反している。
バージョン
MFCのバージョンは、バージョン6.0以降は対応するVisual C++製品のバージョン番号と同じになっています。Visual C++コンパイラのバージョンは`_MSC_VER`で定義され、MFCのバージョンは`_MFC_VER`で定義されます。
Visual C++ .NET 2003までは、ランタイムライブラリはシステムフォルダにインストールされていましたが、Windows XP以降は、DLL地獄を解消するためSide-by-Sideアセンブリとしてインストールされるようになりました。これにより、複数の異なるバージョンが共存できるようになりました。Visual C++ 2005および2008では、MFCを使用するアプリケーションをエンドユーザー環境で実行するには、ランタイムパッケージのインストール、スタティックリンク、またはアプリケーションマニフェストによるプライベートアセンブリ化が必要です。
Visual C++ 2010以降では、再びランタイムライブラリはシステムフォルダにインストールされるようになりました。
MFCでは、コンパイル時に定義されたMBCS/UNICODEシンボルに応じて、MBCS版またはUnicode版のライブラリがリンクされます。MBCS版はANSIマルチバイト文字セット(例えば日本語版ではShift_JIS)を使用し、Unicode版はUTF-16LEを使用します。Windowsの内部文字コードはUTF-16LEであるため、一般的にアプリケーションの内部文字コードとしてUTF-8やUTF-32は使用されません。
MBCSとUnicodeの両方で動作するコードを記述するには、シンボル定義に応じてコードを分岐させます。MFC/ATL、標準C/C++ランタイムライブラリ、およびWin32 APIには、両対応を容易にするためのマクロ、型、およびヘルパーが用意されています。
Windows NT 3.1は初期からUnicodeに対応していました。Windows 9x系はUnicode非対応であり、C/C++は長らくMBCSを使用してきました。しかし、国際化対応の必要性から、Visual Studio 2005以降はプロジェクトのデフォルト設定がUnicodeとなり、Visual Studio 2013からはMBCS版MFC/ATLライブラリは非推奨となりました。ただし、MBCS版ライブラリはマイクロソフトの公式サイトからダウンロードできます。
Windowsストアアプリ(後のユニバーサルWindowsプラットフォームアプリ)では、MFCは使用できません。また、マルチバイト文字のAPIは使用できず、ASCIIまたはUnicode文字のみが使用可能です。
脚注
[1] Mainsoftが開発したUNIX版MFCツール
関連項目
Microsoft Visual
C++
Windows API
Active Template Library
Windows Template Library
外部リンク
MFC リファレンス
The latest supported Visual C++ downloads
非公式
猫でもわかるプログラミング MFC編
Visual C++ 入門 (MFC)
MFCトピック集
VC++,MFCでのプログラミングでのTips集
VisualC++超入門