Apa perbedaan mendasar antara MFC dan ATL?

110

Dengan asumsi saya hanya menggunakannya untuk program GUI "normal" (tanpa COM, tidak ada ActiveX, tidak ada yang mewah), apa perbedaan mendasar yang akan saya lihat antara ATL dan MFC, untuk membantu saya mencari tahu mana yang akan digunakan?


Saya telah melakukan beberapa penelusuran di web, tetapi pada akhirnya tidak ada jawaban yang benar-benar menjawab pertanyaan saya:

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

    • "ATL adalah cara yang cepat dan mudah untuk membuat komponen COM di C ++ dan mempertahankan footprint kecil. Gunakan ATL untuk membuat kontrol jika Anda tidak memerlukan semua fungsionalitas bawaan yang disediakan secara otomatis oleh MFC."

      Tidak benar-benar menjawab pertanyaan saya, karena:

      • Saya tidak bekerja dengan COM.

      • Apakah ini berarti MFC tidak cepat? Mengapa bagaimana?

    • "MFC memungkinkan Anda membuat aplikasi lengkap, kontrol ActiveX, dan dokumen aktif. Jika Anda telah membuat kontrol dengan MFC, Anda mungkin ingin melanjutkan pengembangan di MFC. Saat membuat kontrol baru, pertimbangkan untuk menggunakan ATL jika Anda tidak membutuhkannya semua fungsionalitas bawaan MFC. "

      Juga tidak menjawab pertanyaan saya, karena:

      • Aku tidak benar-benar tahu apa ActiveX adalah di tempat pertama.

      • Sepertinya Microsoft melarang penggunaan MFC, tetapi saya tidak tahu mengapa.

      • Apa sebenarnya adalah MFC "built-in fungsi" yang ATL tidak memberikan?

    • Secara umum, ini tidak menjawab pertanyaan saya karena tidak menjelaskan kerugian dan alasan di baliknya.

karena secara langsung atau tidak langsung, semuanya sepertinya terhubung kembali ke halaman sebelumnya:

Apa yang saat ini saya amati (dalam beberapa hari terakhir, ketika mencoba mempelajari keduanya):

  • ATL didasarkan pada template, atau polimorfisme waktu kompilasi.
    • Metode ATL cenderung non-virtual, dan cenderung mengembalikan referensi.
  • MFC didasarkan pada metode virtual, atau polimorfisme run-time.
    • Metode MFC cenderung virtual, dan cenderung mengembalikan petunjuk.

Tetapi tampaknya tidak ada perbedaan arsitektural di antara mereka :

  • Keduanya menggunakan peta pesan ( BEGIN_MSG_MAPvs. BEGIN_MESSAGE_MAP... masalah besar)
  • Keduanya membungkus metode Win32 ke dalam kelas
  • Keduanya tampaknya memiliki kelas yang mirip CWndvs.CWindow

Tetapi kemudian, jika tidak ada perbedaan nyata kecuali untuk aspek waktu kompilasi vs. waktu proses, lalu mengapa keduanya ada? Bukankah salah satu dari mereka seharusnya cukup?

Apa yang kulewatkan di sini?

pengguna541686
sumber
3
Saya bisa saja salah, tetapi saya tahu MFC membutuhkan DLL runtime yang lumayan besar, sedangkan menurut saya ATL membangun semuanya menjadi satu exe. ATL pada umumnya lebih ringan. Juga, lihat WTL
Merlyn Morgan-Graham
@ Merlyn: Benar, tapi mengapa itu membutuhkan DLL runtime yang lumayan? Apa perbedaan mendasar yang menyebabkan hal ini?
pengguna541686
1
Perbedaan yang sama antara mewarisi kelas yang telah dikompilasi sebelumnya yang ditautkan dari DLL, dan mewarisi template yang ditautkan oleh penyertaan kode sumber / pembuatan contoh template. Template umumnya adalah pustaka "hanya header". Jawaban saya tidak lengkap, maka di komentar :) MFC masih ada karena adopsi yang besar dan kompatibilitas ke belakang. Jika tidak, MS akan membuangnya ketika mereka membuat pembungkus win32 yang lebih baru. Mereka cenderung memiliki kontrak dukungan yang lama pada perangkat lunak mereka (bervariasi, tetapi hingga 10 tahun). Dukungan tidak kompatibel dengan deprecation, tho.
Merlyn Morgan-Graham
@Merlyn: Jadi yang saya pahami adalah bahwa saya tidak boleh menggunakan MFC? Apa itu "fungsionalitas ekstra" yang terus mereka sebutkan? Apakah saya membutuhkannya?
pengguna541686
2
@ Merlyn: Pernah dengar ATL.DLL? Pernah dengar istilah "Use MFC as Static Library"?
Ajay

Jawaban:

179

Saya pikir jawaban atas pertanyaan Anda sebagian besar bersifat historis, jika Anda melihat kembali bagaimana kedua perpustakaan itu berasal dan berkembang seiring waktu.

Jawaban singkatnya adalah, jika Anda tidak melakukan sesuatu yang "mewah", gunakan ATL. Ini bagus untuk antarmuka pengguna yang sederhana dengan COM yang dimasukkan.

Jawaban panjangnya: MFC dibangun pada awal 90-an untuk mencoba bahasa baru ini yang disebut C ++ dan menerapkannya ke Windows. Itu membuat Office seperti fitur tersedia untuk komunitas pengembangan ketika OS belum memilikinya.

[Edit hiasan: Saya tidak bekerja di Microsoft, jadi saya tidak tahu apakah Office pernah dibangun di atas MFC, tapi saya rasa jawabannya tidak. Kembali di Win 3.1, Win 95 hari, tim Office UI akan menemukan kontrol baru, mengemasnya di perpustakaan, kemudian tim Windows dan MFC akan memasukkan pembungkus dan API ke kontrol tersebut dengan dll yang dapat didistribusikan ulang. Saya kira ada sedikit kolaborasi dan berbagi kode antara tim-tim itu. Akhirnya kontrol tersebut akan membuatnya menjadi sistem operasi dasar dalam paket layanan atau versi Windows berikutnya. Pola ini berlanjut dengan Pita Office yang ditambahkan ke Windows sebagai komponen tambahan setelah Office dikirim, dan sekarang menjadi bagian dari OS Windows.]

Pada saat itu pustaka tersebut cukup primitif, baik karena bahasa C ++ dan kompilernya yang baru, dan Microsoft membangunnya seiring waktu seiring perkembangan Office.

Karena sejarah ini, MFC:

  1. Memiliki desain yang cukup kikuk. Ini dimulai sebagai pembungkus ringan di sekitar API Windows, tetapi berkembang. Ada banyak 'fitur' kecil yang harus diciptakan karena compiler dan bahasanya tidak mendukungnya. Tidak ada templat, mereka menemukan kelas string, mereka menemukan kelas daftar, mereka merancang identifikasi jenis waktu prosesnya sendiri, dll.
  2. Merangkum 20 tahun evolusi Office dan Windows, yang mencakup seluruh muatan omong kosong yang mungkin tidak akan pernah Anda gunakan: Antarmuka Dokumen Tunggal dan Banyak, DDE, COM, COM +, DCOM, Penautan dan Penyematan Dokumen (sehingga Anda dapat menyematkan dokumen kata di aplikasi Anda jika Anda mau), kontrol ActiveX (evolusi penyematan objek untuk web!), Penyimpanan Dokumen Terstruktur, Serialisasi dan Pembuatan Versi, Otomasi (dari tahun-tahun VBA awal), dan tentu saja MVC. Versi terbaru memiliki dukungan untuk docking jendela gaya Visual Studio, dan pita Office. Pada dasarnya setiap teknologi dari Redmond dalam 20 tahun ada di sana. Itu hanya BESAR!
  3. Memiliki banyak kesalahan kecil, bug, solusi, asumsi, dukungan untuk hal-hal yang masih ada yang tidak akan pernah Anda gunakan, dan mereka menyebabkan masalah. Anda harus akrab dengan implementasi banyak kelas dan bagaimana mereka berinteraksi untuk menggunakannya pada proyek ukuran yang layak. Menggali kode sumber MFC selama debugging adalah hal biasa. Menemukan catatan teknis berusia 15 tahun pada beberapa penunjuk menjadi nol yang menyebabkan crash masih terjadi. Asumsi tentang inisialisasi dokumen kuno yang menyematkan barang dapat memengaruhi aplikasi Anda dengan cara yang aneh. Tidak ada yang namanya abstraksi di MFC, Anda perlu bekerja dengan kebiasaan dan internal setiap hari, itu tidak menyembunyikan apa pun. Dan jangan biarkan saya memulai wizard kelas.

ATL ditemukan saat bahasa C ++ berevolusi, dan templat tiba. ATL adalah contoh cara menggunakan template untuk menghindari masalah run-time pustaka MFC:

  1. Peta pesan: Karena berbasis template, tipe diperiksa, dan jika Anda mengacaukan fungsi terikat, itu tidak dibangun. Dalam peta pesan MFC berbasis makro, dan run-time terikat. Hal ini dapat menyebabkan bug aneh, pesan diarahkan ke jendela yang salah, crash jika Anda memiliki fungsi atau makro yang didefinisikan secara tidak benar, atau hanya tidak berfungsi karena ada sesuatu yang tidak terhubung dengan benar. Jauh lebih sulit untuk di-debug, dan lebih mudah dipecah tanpa menyadarinya.
  2. COM / Automation: Mirip dengan peta pesan, COM awalnya terikat waktu berjalan menggunakan Macro, membutuhkan banyak penanganan kesalahan dan menyebabkan masalah aneh. ATL membuatnya berbasis template, mengkompilasi terikat waktu, dan jauh lebih mudah untuk ditangani.

[Edit Hiasan: Pada saat ATL dibuat, peta jalan teknis Microsoft difokuskan pada 'Manajemen Dokumen'. Apple membunuh mereka dalam bisnis penerbitan desktop. 'Penautan dan Penyematan Dokumen' Office merupakan komponen utama untuk meningkatkan fitur 'Manajemen Dokumen' Office agar dapat bersaing di ruang ini. COM adalah teknologi inti yang diciptakan untuk integrasi aplikasi, dan API Penyematan Dokumen didasarkan pada COM. MFC sulit digunakan untuk kasus penggunaan ini. ATL adalah solusi yang baik untuk membuat teknologi khusus ini lebih mudah bagi pihak ketiga untuk mengimplementasikan COM dan memanfaatkan fitur penyematan dokumen.]

Perbaikan kecil ini membuat ATL sangat lebih mudah untuk ditangani pada aplikasi sederhana yang tidak membutuhkan semua kantor seperti fitur MFC. Sesuatu dengan UI sederhana dan beberapa otomatisasi Office dimasukkan. Kecil, cepat, kompilasi terikat waktu, menghemat banyak waktu dan sakit kepala. MFC memiliki perpustakaan kelas yang sangat besar yang bisa jadi kikuk, dan sulit untuk dikerjakan.

Sayangnya ATL mandek. Itu memiliki pembungkus untuk Windows API dan dukungan COM, dan kemudian tidak pernah benar-benar melampaui itu. Ketika Web diluncurkan, semua hal ini agak dilupakan sebagai berita lama.

[Edit Hiasan: Microsoft menyadari bahwa 'Internet Thing' ini akan menjadi besar. Peta jalan teknis mereka berubah secara drastis menjadi fokus pada Internet Explorer, Windows Server, IIS, ASP, SQL Server, COM / DCOM di Server Transaksi Terdistribusi. Jadi Penautan dan Penyematan Dokumen tidak lagi menjadi prioritas tinggi.]

Jejak besar MFC tidak memungkinkan mereka untuk dibuang, jadi masih berkembang perlahan. Template telah dimasukkan kembali ke pustaka, serta bahasa lain dan peningkatan API. (Saya belum pernah mendengar tentang WTL sampai saya melihat pertanyaan ini. :)

Pada akhirnya, yang mana yang akan digunakan hanyalah masalah preferensi. Mayoritas fitur yang Anda perlukan ada di API OS dasar, yang bisa Anda panggil langsung dari salah satu pustaka, jika tidak ada pembungkus yang sesuai di pustaka.

Hanya 2 sen saya berdasarkan penggunaan MFC selama bertahun-tahun, dan saya menggunakannya sekarang setiap hari. Saya mencoba-coba ATL ketika pertama kali dirilis di beberapa proyek selama beberapa tahun. Itu adalah menghirup udara segar pada masa itu, tetapi tidak pernah benar-benar pergi ke mana pun. Dan kemudian Web datang dan saya lupa semuanya.


Edit: Jawaban ini memiliki umur panjang yang mengejutkan. Karena terus bermunculan di halaman tumpukan overflow saya, saya pikir saya akan menambahkan beberapa hiasan ke jawaban asli yang saya pikir kurang.

Jay
sumber
39
+1 Saya berharap saya bisa +10 ini. Terima kasih atas uraian sejarah yang luar biasa - ditulis dengan sangat baik dan informatif! :)
user541686
3
Hanya ingin menyebutkan ... Saya menggunakan MFC selama beberapa hari, kemudian beralih ke ATL / WTL, yang telah saya gunakan cukup lama sekarang. Dan itu sangat luar biasa. Mungkin tidak akan pernah melihat MFC lagi.
pengguna541686
1
Jadi, apakah Microsoft membangun program baru menggunakan keduanya, atau apakah mereka memutuskan untuk menggunakan salah satu dari yang lain?
The Muffin Man
1
Saya pikir saya tahu bedanya..tapi belum pernah melihat penjelasan yang begitu indah dan rumit .. Terima kasih .. Terima kasih banyak :)
shivi
1
Jawaban terbaik yang pernah saya baca tentang topik ini; Anda harus membuat artikel darinya termasuk WTL
Pat
20

Saya telah diberi tahu oleh banyak orang yang telah menggunakan keduanya bahwa pengalaman pemrograman mereka tidak terlalu menyakitkan dengan ATL dibandingkan dengan MFC. Eksekusi terkompilasi Anda juga akan jauh lebih kecil dengan ATL.

Saya sarankan Anda melihat WTL , karena WTL dibangun di atas ATL.

Apa itu "fungsionalitas ekstra" yang terus mereka sebutkan? Apakah saya membutuhkannya?

Jika Anda menentukan kebutuhan Anda, mungkin akan lebih mudah untuk menjawabnya jika Anda dapat menghindari penggunaan MFC. Sayangnya "tidak ada yang mewah" tidak cukup eksklusif. Menjadi inklusif tentang fitur mana yang ingin Anda gunakan mungkin lebih membantu (kontrol mana, framework / teknologi / pustaka yang ada yang ingin Anda gunakan, dll).

Namun berikut adalah artikel yang menjelaskan beberapa fitur di MFC yang tidak didukung secara langsung oleh WTL / ATL.

MFC juga telah berkembang hingga mendukung banyak fitur yang diinginkan, seperti MAPI, dukungan untuk persyaratan logo Windows lainnya, soket, dokumen (jika Anda suka dan / atau menggunakan pola itu), dan file dokumen gabungan. WTL memiliki andil fitur-fitur keren, tetapi MFC adalah jagoan fitur yang jelas. Kedua lingkungan mendukung arsitektur jendela utama berbingkai (jendela bingkai dengan jendela tampilan terpisah), aplikasi SDI dan MDI, jendela terpisah, aplikasi berbasis dialog, dan berbagai kelas berbasis COM untuk dukungan COM.

Merlyn Morgan-Graham
sumber
3
Jawaban Jay mengalahkan ini. Meninggalkan ini untuk tautan ke artikel yang menjelaskan beberapa perbedaan.
Merlyn Morgan-Graham
9

ATL adalah sekumpulan kelas yang dimaksudkan untuk menyederhanakan implementasi objek COM.

Anda dapat menggunakannya tanpa MFC. Di pekerjaan saya, kami menggunakan ATL untuk mengekspos antarmuka COM ke kode komputasi. Tidak ada GUI yang terlibat, kami dapat memanggil kode komputasi ini dari mis. Excel VBA.

Lihatlah beberapa panduan / tutorial COM untuk melihat apa yang abstrak.

MFC hanyalah sekumpulan kelas pembungkus GUI untuk Win32 API. Lihat beberapa tutorial Win32 API untuk melihat apa yang abstrak.

Alexandre C.
sumber
ATL juga dapat digunakan tanpa adanya COM. Banyak kelas di dalamnya tidak ada hubungannya dengan COM yang akan lebih terasa saat melihat WTL.
0xC0000022L
1
@ 0xC0000022L: Saya tidak menyadarinya CWindowImpldan teman-teman ketika saya menulis ini. Sekarang setelah saya memiliki lebih banyak pengalaman dengan ATL, saya dapat mencoba menulis ulang jawaban ini. Secara khusus, ATL / WTL secara virtual dapat menggantikan semua MFC.
Alexandre C.