İki kütüphanenin zaman içinde nasıl ortaya çıkıp geliştiğine bakarsanız, sorunuzun cevabının çoğunlukla tarihsel olduğunu düşünüyorum.
Kısa cevap, "süslü" bir şey yapmıyorsanız, ATL kullanın. COM'un atıldığı basit kullanıcı arayüzleri için harika.
Uzun cevap: MFC, 90'ların başında C ++ adlı bu yeni dili denemek ve Windows'a uygulamak için oluşturuldu. Office benzeri özellikleri, işletim sistemi henüz onlara sahip olmadığında geliştirme topluluğu için kullanılabilir hale getirdi.
[Süslemeyi düzenle: Microsoft'ta çalışmadım, bu yüzden Office'in MFC üzerine inşa edilip edilmediğini bilmiyorum, ancak cevabın hayır olduğunu düşünüyorum. Win 3.1, Win 95 günlerinde, Office UI ekibi yeni denetimler icat eder, bunları kitaplıklarda paketler, ardından Windows ve MFC ekipleri yeniden dağıtılabilir dll'lerle bu denetimlere sarmalayıcılar ve API ekler. Sanırım bu ekipler arasında biraz işbirliği ve kod paylaşımı vardı. Sonunda bu kontroller, hizmet paketlerinde veya sonraki Windows sürümünde temel işletim sistemine geçecektir. Bu model, Office piyasaya sürüldükten çok sonra Windows'a bir eklenti bileşen olarak eklenen ve artık Windows işletim sisteminin bir parçası olan Office Şeridi ile devam etti.]
O zamanlar kitaplık, hem C ++ dili ve derleyicisinin yeni olması hem de Microsoft'un Office geliştikçe zamanla onu oluşturması nedeniyle oldukça ilkeldi.
Bu tarih nedeniyle, MFC:
- Oldukça hantal bir tasarıma sahiptir. Windows API etrafında hafif bir sarmalayıcı olarak başladı, ancak büyüdü. Derleyici ve dil onları desteklemediği için icat edilmesi gereken bir sürü küçük 'özellik' vardır. Şablon yoktu, bir dizgi sınıfı icat ettiler, liste sınıflarını icat ettiler, kendi çalışma zamanı tip tanımlamalarını tasarladılar, vb.
- 20 yıllık Office ve Windows evrimini kapsüller, bu da muhtemelen asla kullanmayacağınız bir sürü şey içerir: Tekli ve Çoklu Belge arayüzleri, DDE, COM, COM +, DCOM, Belge Bağlama ve Gömme (böylece bir word belgesini gömebilirsiniz. isterseniz uygulamanız), ActiveX denetimleri (web için nesne yerleştirmenin evrimi!), Yapılandırılmış Belge Depolama, Serileştirme ve Sürüm Oluşturma, Otomasyon (erken VBA yıllarından itibaren) ve tabii ki MVC. En son sürümler, Visual Studio tarzı pencere yerleştirme ve Office şeridi desteğine sahiptir. Temelde, 20 yılda Redmond'dan çıkan her teknoloji oralarda bir yerlerde. Bu sadece BÜYÜK!
- Bir sürü küçük sorun, hata, geçici çözüm, varsayım, hala orada olan ve asla kullanmayacağınız şeyler için desteğe sahiptir ve sorunlara neden olurlar. Birçok sınıfın uygulanmasına ve onu uygun büyüklükteki bir projede kullanmak için nasıl etkileşime girdiklerine yakından aşina olmanız gerekir. Hata ayıklama sırasında MFC kaynak koduna girmek yaygındır. 15 yıllık bir teknik notu bulmak için bazı işaretçilerin boş olması çökmeye neden oluyor. Eski belge gömme öğelerinin başlatılmasına ilişkin varsayımlar, uygulamanızı garip şekillerde etkileyebilir. MFC'de soyutlama diye bir şey yoktur, her gün tuhaflıkları ve içindekilerle çalışmanız gerekir, hiçbir şeyi gizlemez. Ve beni sınıf sihirbazına sokma.
ATL, C ++ dili geliştikçe icat edildi ve şablonlar geldi. ATL, MFC kitaplığının çalışma zamanı sorunlarını önlemek için şablonların nasıl kullanılacağının bir göstergesiydi:
- Mesaj haritaları: Şablon tabanlı olduklarından, türler kontrol edilir ve bağlı işlevi bozarsanız, oluşturulmaz. MFC'de ileti haritaları makro tabanlıdır ve çalışma zamanına bağlıdır. Bu, tuhaf hatalara, yanlış pencereye yönlendirilen mesaja, işlev veya makro yanlış tanımlanmışsa bir çökmeye veya bir şeyler doğru bağlanmadığı için çalışmamasına neden olabilir. Hata ayıklaması çok daha zor ve farkına varmadan kırılması daha kolay.
- COM / Otomasyon: İleti haritalarına benzer şekilde, COM başlangıçta Makrolar kullanılarak çalıştırma zamanına bağlıydı, çok sayıda hata işleme gerektiriyordu ve garip sorunlara neden oluyordu. ATL, onu şablon tabanlı, derleme zamanına bağlı ve başa çıkması çok daha kolay hale getirdi.
[Süslemeyi Düzenle: ATL'nin oluşturulduğu sırada, Microsoft'un teknik yol haritası esas olarak 'Belge Yönetimi'ne odaklanmıştı. Apple onları masaüstü yayıncılık işinde öldürüyordu. Office 'Belge Bağlama ve Gömme', Office'in 'Belge Yönetimi' özelliklerini bu alanda rekabet edecek şekilde geliştiren ana bileşendi. COM, uygulama entegrasyonu için icat edilen temel bir teknolojiydi ve Document Embedding API'leri COM'a dayanıyordu. MFC'nin bu kullanım durumu için kullanılması zordu. ATL, bu özel teknolojiyi 3. tarafların COM uygulamasını ve belge yerleştirme özelliklerini kullanmasını kolaylaştırmak için iyi bir çözümdü.]
Bu küçük iyileştirmeler, MFC'nin tüm ofis benzeri özelliklerine ihtiyaç duymayan basit bir uygulamada ATL ile başa çıkmayı oldukça kolaylaştırır. Basit bir kullanıcı arayüzüne ve bazı Office otomasyonuna sahip bir şey. Küçüktür, hızlıdır, derleme süresi sınırlıdır ve size çok fazla zaman ve baş ağrısı kazandırır. MFC, hantal ve çalışılması zor olabilen devasa bir sınıf kitaplığına sahiptir.
Ne yazık ki ATL durdu. Windows API ve COM desteği için sarmalayıcıları vardı ve sonra asla bunun ötesine geçmedi. Web ortaya çıktığında, tüm bunlar eski haberler gibi unutulmuştu.
[Süslemeyi Düzenle: Microsoft, bu "İnternet Şeyinin" büyük olacağını fark etti. Teknik yol haritaları, Dağıtılmış İşlem Sunucusunda Internet Explorer, Windows Server, IIS, ASP, SQL Server, COM / DCOM'a odaklanacak şekilde büyük ölçüde değişti. Dolayısıyla, Belge Bağlama ve Gömme artık yüksek bir öncelik değildi.]
MFC'nin devasa ayak izi, onların boşaltılmasını imkansız hale getirdi, bu yüzden yavaş yavaş gelişmeye devam ediyor. Şablonlar, diğer dil ve API geliştirmelerinin yanı sıra kitaplığa geri dahil edilmiştir. (Bu soruyu görene kadar WTL'yi duymamıştım. :)
Nihayetinde hangisinin kullanılacağı sadece bir tercih meselesidir. İhtiyaç duyduğunuz özelliklerin çoğu, kitaplıkta uygun bir sarmalayıcı yoksa, her iki kitaplıktan da doğrudan çağırabileceğiniz temel işletim sistemi API'sindedir.
Sadece 2 sentim uzun yıllar MFC kullanmaya dayanıyor ve şimdi her gün kullanıyorum. Birkaç yıl boyunca birkaç projede ilk kez piyasaya sürüldüğünde ATL ile uğraştım. O günlerde temiz bir soluktu ama hiçbir yere gitmedi. Sonra Web ortaya çıktı ve her şeyi unuttum.
Düzenleme: Bu cevabın şaşırtıcı bir uzun ömürlülüğü var. Yığın taşma sayfamda belirmeye devam ettiğinden, eksik olduğunu düşündüğüm orijinal cevaba biraz süslemeler ekleyeceğimi düşündüm.