MFC ve ATL arasındaki temel fark nedir?


110

Bunları yalnızca "normal" GUI programları için kullandığımı varsayarsak (COM yok, ActiveX yok, hiçbir şey yok), hangisini kullanacağımı anlamama yardımcı olması için ATL ve MFC arasında göreceğim temel fark nedir?


Web'de bazı araştırmalar yaptım, ancak sonuçta hiçbir yanıt sorumu gerçekten yanıtlamadı:

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

    • "ATL, hem C ++ 'da bir COM bileşeni oluşturmanın hem de küçük bir ayak izini korumanın hızlı ve kolay bir yoludur. MFC'nin otomatik olarak sağladığı tüm yerleşik işlevlere ihtiyacınız yoksa, bir denetim oluşturmak için ATL'yi kullanın."

      Soruma gerçekten cevap vermiyor çünkü:

      • COM ile çalışmıyorum.

      • Bu , MFC'nin hızlı olmadığı anlamına mı geliyor ? Neden nasıl?

    • "MFC, tam uygulamalar, ActiveX denetimleri ve etkin belgeler oluşturmanıza olanak tanır. MFC ile zaten bir denetim oluşturduysanız, MFC'de geliştirmeye devam etmek isteyebilirsiniz. Yeni bir denetim oluştururken, ihtiyacınız yoksa ATL kullanmayı düşünün MFC'nin tüm yerleşik işlevleri. "

      Ayrıca soruma cevap vermiyor çünkü:

      • Gerçekten bile ActiveX bilmiyorum olduğu ilk etapta.

      • Görünüşe göre Microsoft, MFC kullanımının cesaretini kırıyor, ancak nedenini anlayamıyorum.

      • Tam olarak ne olduğunu MFC yönettiği "yerleşik işlevlerini" ATL sağlamadığını?

    • Genel olarak bu, soruma cevap vermiyor çünkü olumsuz yönleri ve arkasındaki nedenleri açıklamıyor .

çünkü doğrudan veya dolaylı olarak, her şey önceki sayfaya geri bağlanıyor gibi görünüyor:

Ne var şu anda gözlenen (her ikisi de öğrenmeye çalışırken, son birkaç gün içinde):

  • ATL, şablonlara veya derleme zamanı çok biçimliliğine dayanır.
    • ATL yöntemleri sanal olmama eğilimindedir ve başvuru döndürme eğilimindedir.
  • MFC, sanal yöntemlere veya çalışma zamanı polimorfizmine dayanır.
    • MFC yöntemleri sanal olma eğilimindedir ve işaretçiler döndürme eğilimindedir.

Ancak aralarında herhangi bir mimari fark yok gibi görünüyor :

  • Her ikisi de mesaj haritalarını kullanır ( BEGIN_MSG_MAPvs. BEGIN_MESSAGE_MAP... önemli)
  • Her ikisi de Win32 yöntemlerini sınıflara sarar
  • Hem benzer sınıflar var gibi CWndVS.CWindow

Ama sonra, derleme zamanı ile çalışma zamanı yönü dışında gerçek bir fark yoksa, neden ikisi de var? Bir tanesi yeterli olmamalı mı?

Burada neyi özlüyorum?


3
Yanılıyor olabilirim, ancak MFC'nin biraz ağır bir çalışma zamanı DLL'si gerektirdiğini biliyorum, oysa ATL'nin hepsini tek bir exe'de oluşturduğunu düşünüyorum. ATL genel olarak daha hafiftir. Ayrıca, WTL'ye bakın
Merlyn Morgan-Graham

@Merlyn: Doğru, ama neden ağır bir çalışma zamanı DLL'sine ihtiyaç duyuyor? Buna neden olan temel fark nedir?
user541686

1
Bir DLL'den bağlanan önceden derlenmiş sınıfları miras almak ile kaynak kodu dahil etme / şablon somutlaştırması ile bağlantılı şablonları miras almak arasındaki aynı fark. Şablonlar genellikle "yalnızca başlık" kitaplıklarıdır. Cevabım eksik, dolayısıyla yorumlarda :) MFC, büyük ölçüde benimsenmesi ve geriye dönük uyumluluk nedeniyle hala var. Aksi takdirde MS, daha yeni win32 sarmalayıcıları oluşturduklarında bunu atardı. Yazılımlarında uzun destek sözleşmeleri yapma eğilimindedirler (değişken, ancak 10 yıla kadar). Destek, kullanımdan kaldırmayla uyumsuz değil, tho.
Merlyn Morgan-Graham

@Merlyn: Anladığım kadarıyla MFC kullanmamam gerekiyor mu? Bahsettikleri "ekstra işlevsellik" nedir? Buna ihtiyacım var mı
user541686

2
@Merlyn: ATL.DLL duyuldu mu? "Statik Kitaplık Olarak MFC Kullanın" terimini duydunuz mu?
Ajay

Yanıtlar:


179

İ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:

  1. 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.
  2. 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!
  3. 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:

  1. 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.
  2. 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.


39
+1 Keşke bunu +10 yapabilseydim. Mükemmel tarih tanımı için teşekkürler - çok iyi yazılmış ve bilgilendirici! :)
user541686

3
Bahsetmek istedim ... Birkaç gün MFC kullandım, sonra bir süredir kullandığım ATL / WTL'ye geçtim. Ve bu inanılmaz harika. MFC'ye bir daha asla bakmayacağım, muhtemelen.
user541686

1
Öyleyse Microsoft her ikisini de kullanarak yeni programlar oluşturuyor mu yoksa birini diğerinin üzerine kullanmaya mı karar verdiler?
The Muffin Man

1
Ben difference..but böyle güzel ve özenli explanation..Thumbs up..Thanks bir ton :) görmemiştim bildiğini sanıyordum
shivi

1
Bu konuda okuduğum en iyi cevap; WTL de dahil olmak üzere bir makale yapmalısınız
Pat

20

Her ikisini de kullanan birçok kişi, programlama deneyimlerinin ATL ile MFC'den daha az acı verici olduğunu söylediler. Derlenmiş çalıştırılabilir dosyanız da ATL ile çok daha küçük olacaktır.

ATL üzerine inşa edildiği için WTL'ye bir göz atmanızı tavsiye ederim .

Bahsettikleri "ekstra işlevsellik" nedir? Buna ihtiyacım var mı

Gereksinimlerinizi tanımlarsanız, MFC'yi kullanmaktan kaçınabilirseniz cevap vermek daha kolay olabilir. Ne yazık ki "süslü hiçbir şey" yeterince özel değil. Hangi özellikleri kullanmayı planladığınız konusunda kapsayıcı olmak daha yararlı olabilir (hangi kontroller, kullanmak istediğiniz çerçeveler / teknolojiler / mevcut kitaplıklar vb.).

Ancak burada , MFC'de WTL / ATL tarafından doğrudan desteklenmeyen bazı özellikleri açıklayan bir makale var.

MFC ayrıca, MAPI, diğer Windows logo gereksinimleri için destek, soketler, belgeler (isterseniz ve / veya bu deseni kullanırsanız) ve bileşik belge dosyaları gibi pek çok istenen özelliği desteklediği noktaya kadar gelişmiştir. WTL, harika özelliklerden payına sahiptir, ancak MFC açık özellik şampiyonudur. Her iki ortam da çerçeveli ana pencere mimarilerini (ayrı görünüm pencereli çerçeve penceresi), SDI ve MDI uygulamalarını, bölünmüş pencereleri, iletişim tabanlı uygulamaları ve COM desteği için çeşitli COM tabanlı sınıfları destekler.


3
Jay'in cevabı bu tempoya sahip. Bunu, bazı farklılıkları açıklayan makaleye bağlantı için bırakmak.
Merlyn Morgan-Graham

9

ATL, COM nesnelerinin uygulanmasını basitleştirmeyi amaçlayan bir sınıf kümesidir.

MFC olmadan kullanabilirsiniz. Benim işimde, COM arayüzlerini hesaplama koduna maruz bırakmak için ATL kullanıyoruz. Herhangi bir GUI yoktur, bu hesaplama kodunu örn. Excel VBA.

Nelerin özetlendiğini görmek için bazı COM kılavuzuna / eğitimine bakın.

MFC, Win32 API'sine yönelik bir dizi GUI sarmalayıcı sınıfıdır. Neleri özetlediğini görmek için bazı Win32 API eğitimlerine bakın.


ATL, dahil olan herhangi bir COM olmadan da kullanılabilir. İçindeki birçok sınıfın COM ile ilgisi yoktur, bu da WTL'ye bakıldığında daha da belirginleşir.
0xC0000022L

1
@ 0xC0000022L: CWindowImplBunu yazdığımda farkında değildim ve arkadaşlarım. Artık ATL ile daha fazla deneyimim olduğuna göre, bu cevabı yeniden yazmaya çalışabilirim. Özellikle, ATL / WTL neredeyse tüm MFC'nin yerini alabilir.
Alexandre C.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.