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:
Bagaimana cara memutuskan apakah akan menggunakan ATL, MFC, Win32 atau CLR untuk proyek C ++ baru?
"ATL & MFC agak lebih sulit untuk diputuskan. [[Tidak bercanda!]] Saya akan merujuk Anda ke halaman MSDN untuk memilih guna memutuskan di antara mereka."
Jelas , ini tidak menjawab pertanyaan saya. :)
http://www.codeguru.com/forum/archive/index.php/t-64778.html
dll.
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_MAP
vs.BEGIN_MESSAGE_MAP
... masalah besar) - Keduanya membungkus metode Win32 ke dalam kelas
- Keduanya tampaknya memiliki kelas yang mirip
CWnd
vs.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?
sumber
Jawaban:
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:
ATL ditemukan saat bahasa C ++ berevolusi, dan templat tiba. ATL adalah contoh cara menggunakan template untuk menghindari masalah run-time pustaka MFC:
[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.
sumber
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.
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.
sumber
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.
sumber
CWindowImpl
dan 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.