MFCとATLの基本的な違いは何ですか?


110

それらを「通常の」GUIプログラム(COMなし、ActiveXなし、派手なものなし)にのみ使用していると仮定すると、ATLとMFCの基本的な違いは何ですか?


私はウェブでいくつかの検索を行いましたが、結局のところ、どの回答も実際には私の質問に答えていません。

  • http://msdn.microsoft.com/en-us/library/bk8ytxz5(v=vs.80).aspx

    • 「ATLは、C ++でCOMコンポーネントを作成し、小さなフットプリントを維持するための高速で簡単な方法です。MFCが自動的に提供するすべての組み込み機能が必要ない場合は、ATLを使用してコントロールを作成します。」

      次の理由により、私の質問には実際には回答しません。

      • COMを使用していません。

      • これはMFC 高速でないことを意味しますか?なぜ、どのように?

    • 「MFCを使用すると、完全なアプリケーション、ActiveXコントロール、およびアクティブドキュメントを作成できます。既にMFCでコントロールを作成している場合は、MFCでの開発を継続することをお勧めします。新しいコントロールを作成するとき、必要がない場合はATLの使用を検討してくださいMFCのすべての組み込み機能。」

      また、私の質問には答えません。

      • そもそも、ActiveX 何なのか、私にもよくわかりません。

      • マイクロソフトがMFCの使用を推奨していないように見えますが、理由がわかりません。

      • ATLが提供しないMFCの「組み込み機能」と正確に何ですか?

    • 一般的に、これは私の疑問に答えません。なぜなら、それは欠点とその背後にある理由を説明しないからです。

直接的または間接的に、すべてが前のページにリンクしているように見えるためです。

私が現在観察しいるもの(過去2日間、両方を学習しようとしている間):

  • ATLはテンプレート、またはコンパイル時のポリモーフィズムに基づいています。
    • ATLメソッドは非仮想である傾向があり、参照を返す傾向があります。
  • MFCは仮想メソッド、または実行時のポリモーフィズムに基づいています。
    • MFCメソッドは仮想である傾向があり、ポインターを返す傾向があります。

しかし、それらの間にアーキテクチャ上の違いはないようです

  • どちらもメッセージマップを使用します(BEGIN_MSG_MAPBEGIN_MESSAGE_MAP...大したこと)
  • どちらもWin32メソッドをクラスにラップします
  • どちらも、同様のクラスの持っているように思わCWnd対をCWindow

しかし、コンパイル時と実行時の側面以外に実際の違いがない場合、なぜ両方が存在するのでしょうか。それらの1つで十分ではありませんか?

ここで何が欠けていますか?


3
私は間違っている可能性がありますが、MFCには多少高額なランタイムDLLが必要ですが、ATLはすべてを1つのexeにビルドすると思います。一般的にATLは軽量です。また、WTL
。MerlynMorgan-Graham、

@マーリン:そうですが、なぜそれは多額のランタイムDLLを必要とするのですか?これを引き起こす根本的な違いは何ですか?
user541686 2011

1
DLLからリンクされたプリコンパイル済みクラスの継承と、ソースコードのインクルード/テンプレートのインスタンス化によってリンクされたテンプレートの継承との違いは同じです。テンプレートは一般に「ヘッダーのみ」のライブラリです。私の答えは不完全なので、コメント内にあります:) MFCは、大規模な採用と下位互換性のためにまだ存在しています。そうでなければ、MSは新しいwin32ラッパーを作成したときにそれを捨てていたでしょう。彼らはソフトウェアのサポート契約が長くなる傾向があります(さまざまですが、最長で10年)。サポートは非​​難と互換性がありません。
Merlyn Morgan-Graham、

@マーリン:だから私が理解していることは、MFCを使うべきではないということですか?彼らが言及し続ける「追加機能」とは何ですか?必要ですか?
user541686 2011

2
@マーリン:ATL.DLLを聞いたことはありますか?「MFCを静的ライブラリとして使用する」という言葉を聞いたことがありますか?
Ajay、2011

回答:


179

2つのライブラリーがどのようにして生まれ、どのように進化してきたかを振り返ると、質問に対する答えはほとんど歴史的なものだと思います。

簡単な答えは、「空想」を何もしていない場合は、ATLを使用することです。COMがスローされた単純なユーザーインターフェイスに最適です。

長い答え:MFCはC ++と呼ばれるこの新しい言語を試し、それをWindowsに適用するために90年代前半に構築されました。OSにまだないようなOfficeのような機能を開発コミュニティで利用できるようにしました。

[装飾を編集する:私はMicrosoftで働いていなかったので、OfficeがMFC上に構築されたかどうかはわかりませんが、答えは「いいえ」です。勝利3.1、勝利95日目に戻って、Office UIチームは新しいコントロールを発明し、それらをライブラリにパッケージ化し、WindowsおよびMFCチームはラッパーとAPIを再配布可能なdllを備えたこれらのコントロールに組み込みました。これらのチーム間でのコラボレーションとコードの共有が少しあったと思います。最終的にこれらのコントロールは、サービスパックまたは次のWindowsバージョンのベースオペレーティングシステムに組み込まれます。このパターンは、Officeが出荷された後にアドオンコンポーネントとしてWindowsに追加されたOfficeリボンでも継続され、現在はWindows OSの一部となっています。]

その当時、ライブラリはかなり原始的でした。これは、C ++言語とコンパイラが新しく、MicrosoftがOfficeの進化に伴ってライブラリを構築していたためです。

この歴史のおかげで、MFCは次のことを行います。

  1. かなり不格好なデザインです。それはWindows APIの軽いラッパーとして始まりましたが、成長しました。コンパイラと言語がそれらをサポートしていなかったために発明されなければならない小さな「機能」がたくさんあります。テンプレートはなく、文字列クラスを発明し、リストクラスを発明し、独自のランタイム型識別を設計しました。
  2. 20年にわたるOfficeおよびWindowsの進化をカプセル化します。これには、おそらく決して使用しないだろうすべてのがらくたが含まれます。単一および複数のドキュメントインターフェイス、DDE、COM、COM +、DCOM、ドキュメントのリンクと埋め込み(したがって、Wordドキュメントを必要に応じてアプリ)、ActiveXコントロール(Webへのオブジェクト埋め込みの進化!)、構造化ドキュメントストレージ、シリアル化とバージョン管理、自動化(VBAの初期の時代から)、そしてもちろんMVC。最新バージョンは、Visual StudioスタイルのウィンドウドッキングとOfficeリボンをサポートしています。基本的に、レドモンドの20年後のすべてのテクノロジーはどこかにあります。それだけで巨大です!
  3. ちょっとした落とし穴、バグ、回避策、前提、まだ使用されていないものをサポートし、問題を引き起こします。多くのクラスの実装と、それらがまともなサイズのプロジェクトで使用するためにどのように相互作用するかをよく理解している必要があります。デバッグ中にMFCソースコードを掘り下げることは一般的です。ポインタがnullでクラッシュを引き起こす15年前のテクニカルノートを見つけることはまだ起こります。古代のドキュメント埋め込みに関する初期化の前提は、奇妙な方法でアプリケーションに影響を与える可能性があります。MFCには抽象化などというものはありません。日常の癖や内部を操作する必要があります。何も隠しません。クラスウィザードを開始しないでください。

ATLは、C ++言語の進化とともに発明され、テンプレートが登場しました。ATLは、MFCライブラリの実行時の問題を回避するためにテンプレートを使用する方法のショーケースでした。

  1. メッセージマップ:これらはテンプレートベースであるため、型がチェックされ、バインドされた関数を台無しにしても、ビルドされません。MFCでは、メッセージマップはマクロベースで、実行時にバインドされます。これにより、奇妙なバグ、誤ったウィンドウにメッセージがルーティングされる、関数またはマクロが正しく定義されていない場合にクラッシュする、または何かが正しく接続されていないために機能しない可能性があります。デバッグするのがはるかに難しく、気付かずにブレークするのが簡単です。
  2. COM / Automation:メッセージマップと同様に、COMは元々マクロを使用してランタイムにバインドされていたため、多くのエラー処理を必要とし、奇妙な問題を引き起こしていました。ATLにより、テンプレートベースでコンパイル時間に制限があり、処理がはるかに簡単になりました。

[装飾の編集:ATLが作成されたとき、Microsoftの技術ロードマップは主に「ドキュメント管理」に焦点を当てていました。Appleはデスクトップパブリッシングビジネスで彼らを殺していました。Officeの「ドキュメントのリンクと埋め込み」は、Officeの「ドキュメント管理」機能を強化してこの分野で競争するための主要なコンポーネントでした。COMは、アプリケーション統合のために発明されたコアテクノロジであり、Document Embedding APIはCOMに基づいていました。この使用例では、MFCの使用は困難でした。ATLは、この特定のテクノロジをサードパーティがCOMを実装し、ドキュメントの埋め込み機能を利用しやすくするための優れたソリューションでした。]

これらの小さな改良により、MFCの機能のようなオフィスのすべてを必要としないシンプルなアプリケーションでATLを非常に簡単に処理できるようになります。シンプルなUIといくつかのOfficeオートメーションが組み込まれたもの。それは小さく、高速であり、コンパイル時間に制限があるため、多くの時間と頭痛を節約できます。MFCには、扱いにくい、扱いにくいクラスの巨大なライブラリがあります。

残念ながらATLは停滞した。Windows APIとCOMサポート用のラッパーがあり、それを超えることはありませんでした。Webが始まったとき、これらすべては古いニュースとして忘れられていました。

[装飾の編集:マイクロソフトは、この「インターネットシング」が大きくなることを認識しました。彼らの技術ロードマップは劇的に変化し、Internet Explorer、Windows Server、IIS、ASP、SQL Server、分散トランザクションサーバーのCOM / DCOMに焦点が当てられました。そのため、ドキュメントのリンクと埋め込みはもはや最優先事項ではありませんでした。]

MFCの巨大なフットプリントにより、ダンプすることが不可能になり、それでもまだゆっくりと進化しています。テンプレートがライブラリに組み込まれ、他の言語とAPIの機能強化も行われました。(私はこの質問を見るまでWTLを知りませんでした。:)

最終的に、どちらを使用するかは、単に好みの問題です。ライブラリに適切なラッパーがない場合、必要な機能の大部分はベースOS APIにあります。これは、ライブラリから直接呼び出すことができます。

MFCを何年も使用していることに基づいた私の2セントだけで、現在は毎日使用しています。2、3のプロジェクトで最初にリリースされたとき、ATLに手を出しました。当時は新鮮な空気でしたが、どこにも行きませんでした。その後、Webが登場し、すべてを忘れてしまいました。


編集:この答えは驚くべき長寿を持っています。それは私のスタックオーバーフローページにポップアップし続けているので、私は不足していると思った元の回答にいくつかの装飾を追加すると思いました。


39
+1これを+10できたらいいのに。素晴らしい歴史の説明をありがとう-それはとてもよく書かれていて有益です!:)
user541686 2011

3
言及したかったのですが、MFCを数日間使用してから、しばらくの間使用していたATL / WTLに切り替えました。そして、それは恐ろしいほど素晴らしいです。おそらくMFCを二度と見ないでしょう。
user541686

1
マイクロソフトは両方を使用して新しいプログラムを構築するのですか、それともどちらか一方をもう一方を使用することに決めましたか?
マフィンマン

1
私は私が:)など美しく精巧なexplanation..Thumbsのup..Thanksトンを見たことがないdifference..but知っていたと思った
shivi

1
このトピックに関して私が今まで読んだ最良の答え。WTLを含む記事から作成する必要があります
Pat

20

両方を使用した多くの人から、プログラミングの経験はMFCよりもATLの方が苦痛が少ないと言われています。コンパイルされた実行可能ファイルも、ATLを使用するとはるかに小さくなります。

WTLは、ATLに基づいて構築されているため、ぜひご覧ください

彼らが言及し続ける「追加機能」とは何ですか?必要ですか?

要件を定義する場合、MFCの使用を回避できると、答えが簡単になる可能性があります。残念ながら、「空想はない」だけでは十分ではありません。使用する予定の機能について包括的である方が便利な場合があります(どのコントロール、どのフレームワーク/テクノロジ/既存のライブラリを使用するかなど)。

しかし、これはWTL / ATLで直接サポートされていないMFCのいくつかの機能を説明する記事です。

MFCは、MAPI、他のWindowsロゴ要件のサポート、ソケット、ドキュメント(そのパターンが好きな場合やそのパターンを使用する場合)、複合ドキュメントファイルなど、多くの望ましい機能をサポートするように進化しました。WTLには優れた機能がいくつかありますが、MFCは機能の明確なチャンピオンです。どちらの環境も、フレーム付きメインウィンドウアーキテクチャ(個別のビューウィンドウを持つフレームウィンドウ)、SDIおよびMDIアプリケーション、分割ウィンドウ、ダイアログベースのアプリケーション、およびCOMサポート用のさまざまなCOMベースのクラスをサポートしています。


3
ジェイの答えはこのビートです。いくつかの違いを説明する記事へのリンクにこれを残します。
Merlyn Morgan-Graham

9

ATLは、COMオブジェクトの実装を簡略化することを目的とした一連のクラスです。

MFCがなくても使用できます。私の仕事では、ATLを使用してCOMインターフェイスを計算コードに公開します。関連するGUIはありません。たとえば、この計算コードを呼び出すことができるようにするためです。Excel VBA。

抽象化されているものについては、いくつかのCOMガイド/チュートリアルを参照してください。

MFCは、Win32 APIに対する単なるGUIラッパークラスのセットです。Win32 APIチュートリアルを見て、何が抽象化されているかを確認してください。


ATLは、COMを使用せずに使用することもできます。その中の多くのクラスはCOMとは関係がなく、WTLを見るとさらに顕著になります。
0xC0000022L 2014

1
@ 0xC0000022L:CWindowImplこれを書いたとき、私は知らなかったし、友達もいなかった。ATLの経験が増えたので、この回答を書き直すことができます。特に、ATL / WTLは実質的にすべてのMFCを置き換えることができます。
Alexandre C.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.