Sự khác biệt cơ bản giữa MFC và ATL là gì?


110

Giả sử tôi chỉ sử dụng chúng cho các chương trình GUI "bình thường" (không có COM, không có ActiveX, không có gì lạ mắt), thì sự khác biệt cơ bản mà tôi sẽ thấy giữa ATL và MFC là gì, để giúp tôi tìm ra nên sử dụng cái nào?


Tôi đã thực hiện một số tìm kiếm trên web, nhưng cuối cùng không có câu trả lời nào thực sự trả lời câu hỏi của tôi:

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

    • "ATL là một cách nhanh chóng, dễ dàng để vừa tạo thành phần COM trong C ++ vừa duy trì một lượng nhỏ. Sử dụng ATL để tạo điều khiển nếu bạn không cần tất cả các chức năng tích hợp mà MFC tự động cung cấp."

      Không thực sự trả lời câu hỏi của tôi, bởi vì:

      • Tôi không làm việc với COM.

      • Điều này có nghĩa MFC không nhanh? Sao lại như vậy?

    • "MFC cho phép bạn tạo ứng dụng đầy đủ, điều khiển ActiveX và tài liệu hoạt động. Nếu bạn đã tạo điều khiển với MFC, bạn có thể muốn tiếp tục phát triển trong MFC. Khi tạo điều khiển mới, hãy cân nhắc sử dụng ATL nếu bạn không cần tất cả các chức năng tích hợp của MFC. "

      Cũng không trả lời câu hỏi của tôi, bởi vì:

      • Tôi thậm chí còn không biết ActiveX gì ngay từ đầu.

      • Có vẻ như Microsoft không khuyến khích sử dụng MFC, nhưng tôi không thể tìm ra lý do tại sao.

      • Chính xác thì "chức năng tích hợp" của MFC mà ATL không cung cấp là gì?

    • Nói chung, điều này không trả lời được câu hỏi của tôi bởi vì nó không giải thích được những mặt trái và lý do đằng sau chúng.

bởi vì trực tiếp hoặc gián tiếp, mọi thứ dường như liên kết trở lại trang trước:

Những gì tôi hiện đã quan sát được (trong vài ngày qua, trong khi cố gắng tìm hiểu cả hai):

  • ATL dựa trên các mẫu, hoặc đa hình thời gian biên dịch.
    • Các phương thức ATL có xu hướng không ảo và có xu hướng trả về các tham chiếu.
  • MFC dựa trên các phương thức ảo, hoặc đa hình thời gian chạy.
    • Các phương thức MFC có xu hướng ảo và có xu hướng trả về con trỏ.

Nhưng dường như không có bất kỳ sự khác biệt nào về kiến ​​trúc giữa chúng :

  • Cả hai đều sử dụng bản đồ tin nhắn ( BEGIN_MSG_MAPso vớiBEGIN_MESSAGE_MAP ... vấn đề lớn)
  • Cả hai đều gói các phương thức Win32 thành các lớp
  • Cả hai dường như có các lớp tương tự CWndvs.CWindow

Nhưng sau đó, nếu không có sự khác biệt thực sự ngoại trừ khía cạnh thời gian biên dịch và thời gian chạy, thì tại sao cả hai đều tồn tại? Liệu một trong số chúng có đủ không?

Tôi còn thiếu gì ở đây?


3
Tôi có thể sai, nhưng tôi biết MFC yêu cầu một DLL thời gian chạy hơi nặng, trong khi tôi nghĩ ATL xây dựng tất cả thành một exe. Nhìn chung ATL có trọng lượng nhẹ hơn. Ngoài ra, hãy xem WTL
Merlyn Morgan-Graham

@Merlyn: Đúng vậy, nhưng tại sao nó cần một DLL thời gian chạy khổng lồ? Sự khác biệt cơ bản gây ra điều này là gì?
user541686

1
Sự khác biệt giống nhau giữa việc kế thừa các lớp được biên dịch trước được liên kết trong từ một DLL và kế thừa các mẫu được liên kết bằng cách đưa vào mã nguồn / khởi tạo mẫu. Các mẫu thường là thư viện "chỉ dành cho tiêu đề". Câu trả lời của tôi là không đầy đủ, do đó trong các ý kiến ​​:) MFC vẫn tồn tại do sự chấp nhận lớn và khả năng tương thích ngược. Nếu không, MS sẽ loại bỏ nó khi họ tạo các trình bao bọc win32 mới hơn. Họ có xu hướng có hợp đồng hỗ trợ dài hạn trên phần mềm của họ (thay đổi, nhưng tối đa 10 năm). Hỗ trợ không tương thích với việc không dùng nữa, tho.
Merlyn Morgan-Graham

@Merlyn: Vậy điều tôi hiểu là tôi không nên sử dụng MFC? "Chức năng bổ sung" mà họ tiếp tục đề cập là gì? Tôi có cần nó không?
user541686,

2
@Merlyn: Nghe nói về ATL.DLL? Bạn đã nghe thuật ngữ "Sử dụng MFC làm Thư viện tĩnh"?
Ajay

Câu trả lời:


179

Tôi nghĩ câu trả lời cho câu hỏi của bạn chủ yếu là lịch sử, nếu bạn nhìn lại cách hai thư viện bắt nguồn và phát triển qua thời gian.

Câu trả lời ngắn gọn là, nếu bạn không làm bất cứ điều gì "lạ mắt", hãy sử dụng ATL. Nó tuyệt vời cho các giao diện người dùng đơn giản với COM được đưa vào.

Câu trả lời dài: MFC được xây dựng vào đầu những năm 90 để thử ngôn ngữ mới này có tên là C ++ và áp dụng nó cho Windows. Nó làm cho Office giống như các tính năng có sẵn cho cộng đồng phát triển khi hệ điều hành chưa có chúng.

[Chỉnh sửa bổ sung: Tôi không làm việc tại Microsoft, vì vậy tôi không biết liệu Office có bao giờ được xây dựng trên MFC hay không, nhưng tôi nghĩ câu trả lời là không. Trở lại Win 3.1, Win 95 days, nhóm Office UI sẽ phát minh ra các điều khiển mới, đóng gói chúng trong thư viện, sau đó nhóm Windows và MFC sẽ kết hợp các trình bao bọc và API vào các điều khiển đó với các khối có thể phân phối lại. Tôi đoán rằng có một chút cộng tác và chia sẻ mã giữa các nhóm đó. Cuối cùng những điều khiển đó sẽ đưa nó vào hệ điều hành cơ bản trong các gói dịch vụ hoặc phiên bản Windows tiếp theo. Mô hình này tiếp tục với Ruy-băng Office đã được thêm vào Windows như một thành phần bổ trợ sau khi Office xuất xưởng và hiện là một phần của Hệ điều hành Windows.]

Vào thời điểm đó, thư viện còn khá sơ khai, cả vì ngôn ngữ C ++ và trình biên dịch đều mới, và Microsoft đã xây dựng nó theo thời gian khi Office phát triển.

Vì lịch sử này, MFC:

  1. Có một thiết kế khá vụng về. Nó bắt đầu như một trình bao bọc nhẹ xung quanh API Windows, nhưng đã phát triển. Có một loạt 'tính năng' nhỏ đã phải được phát minh vì trình biên dịch và ngôn ngữ không hỗ trợ chúng. Không có khuôn mẫu, họ phát minh ra lớp chuỗi, họ phát minh ra lớp danh sách, họ thiết kế nhận dạng kiểu thời gian chạy của riêng mình, v.v.
  2. Gói gọn 20 năm phát triển của Office và Windows, trong đó bao gồm toàn bộ những thứ mà bạn có thể sẽ không bao giờ sử dụng: Giao diện một và nhiều tài liệu, DDE, COM, COM +, DCOM, Liên kết và Nhúng tài liệu (vì vậy bạn có thể nhúng một tài liệu word vào ứng dụng của bạn nếu bạn muốn), điều khiển ActiveX (sự phát triển của việc nhúng đối tượng cho web!), Lưu trữ tài liệu có cấu trúc, Tuần tự hóa và tạo phiên bản, Tự động hóa (từ những năm đầu VBA) và tất nhiên là MVC. Các phiên bản mới nhất có hỗ trợ gắn cửa sổ kiểu Visual Studio và dải băng Office. Về cơ bản, mọi công nghệ của Redmond trong 20 năm đều ở đâu đó. Nó chỉ là KHỔNG LỒ!
  3. Có rất nhiều lỗi nhỏ, lỗi, cách giải quyết, giả định, hỗ trợ cho những thứ vẫn còn đó mà bạn sẽ không bao giờ sử dụng và chúng gây ra vấn đề. Bạn cần phải quen thuộc với việc triển khai nhiều lớp và cách chúng tương tác để sử dụng nó trong một dự án quy mô vừa phải. Chuyển sang mã nguồn MFC trong quá trình gỡ lỗi là phổ biến. Việc tìm thấy một ghi chú công nghệ 15 năm tuổi trên một con trỏ nào đó không có giá trị gây ra sự cố vẫn xảy ra. Các giả định về việc khởi tạo nội dung nhúng tài liệu cổ có thể ảnh hưởng đến ứng dụng của bạn theo những cách kỳ lạ. Không có cái gì gọi là trừu tượng trong MFC, bạn cần phải làm việc với những điều kỳ quặc và nội bộ của nó hàng ngày, nó không che giấu bất cứ điều gì. Và đừng giúp tôi bắt đầu với trình hướng dẫn lớp học.

ATL được phát minh khi ngôn ngữ C ++ phát triển và các mẫu đã ra đời. ATL là một giới thiệu về cách sử dụng các mẫu để tránh các vấn đề về thời gian chạy của thư viện MFC:

  1. Bản đồ thư: Vì chúng dựa trên khuôn mẫu, các loại sẽ được kiểm tra và nếu bạn làm hỏng chức năng liên kết, nó sẽ không được xây dựng. Trong MFC, bản đồ tin nhắn dựa trên macro và giới hạn thời gian chạy. Điều này có thể gây ra các lỗi kỳ lạ, thông báo được chuyển đến cửa sổ sai, sự cố nếu bạn có chức năng hoặc macro được xác định không chính xác hoặc chỉ đơn giản là không hoạt động vì một cái gì đó không được kết nối đúng. Khó gỡ lỗi hơn nhiều và dễ bị hỏng hơn nếu không để ý.
  2. COM / Automation: Tương tự như bản đồ tin nhắn, COM ban đầu bị ràng buộc về thời gian chạy bằng cách sử dụng Macro, đòi hỏi nhiều lỗi xử lý và gây ra các vấn đề kỳ lạ. ATL đã làm cho nó dựa trên khuôn mẫu, biên dịch có giới hạn thời gian và nhiều, dễ dàng hơn để xử lý.

[Chỉnh sửa Embellishment: Vào thời điểm ATL được tạo ra, bản đồ kỹ thuật của Microsoft chủ yếu tập trung vào 'Quản lý tài liệu'. Apple đã giết họ trong lĩnh vực kinh doanh xuất bản máy tính để bàn. Office 'Liên kết và Nhúng Tài liệu' là một thành phần chính để nâng cao các tính năng 'Quản lý Tài liệu' của Office để cạnh tranh trong không gian này. COM là công nghệ cốt lõi được phát minh để tích hợp ứng dụng và API nhúng tài liệu dựa trên COM. MFC rất khó sử dụng cho trường hợp sử dụng này. ATL là một giải pháp tốt để làm cho công nghệ cụ thể này dễ dàng hơn để bên thứ 3 triển khai COM và sử dụng các tính năng nhúng tài liệu.]

Những cải tiến nhỏ này làm cho ATL dễ dàng hơn rất nhiều đối với một ứng dụng đơn giản không cần tất cả các văn phòng như các tính năng của MFC. Một cái gì đó với giao diện người dùng đơn giản và một số tự động hóa Office được đưa vào. Nó nhỏ, nhanh, biên dịch có giới hạn thời gian giúp bạn tiết kiệm nhiều thời gian và đau đầu. MFC có một thư viện khổng lồ về các lớp có thể phức tạp và khó làm việc.

Thật không may, ATL bị đình trệ. Nó có các trình bao bọc cho hỗ trợ API và COM của windows, và sau đó nó không bao giờ thực sự vượt ra ngoài điều đó. Khi Web phát triển, tất cả những thứ này đã bị lãng quên như một tin cũ.

[Chỉnh sửa Cải tạo: Microsoft nhận ra rằng 'Internet Thing' này sẽ rất lớn. Lộ trình kỹ thuật của họ đã thay đổi đáng kể để tập trung vào Internet Explorer, Windows Server, IIS, ASP, SQL Server, COM / DCOM trong Máy chủ giao dịch phân tán. Vì vậy, Liên kết và Nhúng tài liệu không còn là ưu tiên cao.]

Dấu chân khổng lồ của MFC khiến họ không thể đổ được, vì vậy nó vẫn phát triển chậm. Các mẫu đã được đưa trở lại thư viện, cũng như các cải tiến về ngôn ngữ và API khác. (Tôi đã không nghe nói về WTL cho đến khi tôi nhìn thấy câu hỏi này. :)

Cuối cùng, việc sử dụng cái nào chỉ đơn giản là vấn đề sở thích. Phần lớn các tính năng bạn cần nằm trong API hệ điều hành cơ sở, bạn có thể gọi trực tiếp từ một trong hai thư viện, nếu không có trình bao bọc phù hợp trong thư viện.

Chỉ 2 xu của tôi dựa trên việc sử dụng MFC trong nhiều năm, và bây giờ tôi sử dụng nó hàng ngày. Tôi đã thử ATL khi nó được phát hành lần đầu tiên trên một số dự án trong vài năm. Đó là một luồng không khí trong lành trong những ngày đó, nhưng chưa bao giờ thực sự đi đến đâu. Và rồi Web xuất hiện và tôi quên hết nó.


Chỉnh sửa: Câu trả lời này có tuổi thọ đáng ngạc nhiên. Vì nó liên tục xuất hiện trong trang tràn ngăn xếp của tôi, tôi nghĩ rằng tôi sẽ thêm một số chỉnh sửa cho câu trả lời ban đầu mà tôi nghĩ là thiếu.


39
+1 Tôi ước tôi có thể +10 điều này. Cảm ơn vì phần mô tả lịch sử xuất sắc - nó được viết rất hay và nhiều thông tin! :)
user541686

3
Tôi chỉ muốn đề cập đến ... Tôi đã sử dụng MFC trong vài ngày, sau đó chuyển sang ATL / WTL, mà tôi đã sử dụng một thời gian. Và nó thật tuyệt vời. Có lẽ sẽ không bao giờ nhìn MFC nữa.
user541686

1
Vậy Microsoft có xây dựng các chương trình mới bằng cách sử dụng cả hai hay họ đã quyết định sử dụng cái này thay cho cái kia?
The Muffin Man,

1
Tôi nghĩ tôi biết các difference..but chưa bao giờ thấy một đẹp và công phu explanation..Thumbs up..Thanks như một tấn :)
shivi

1
Câu trả lời hay nhất mà tôi từng đọc về chủ đề này; bạn nên thực hiện một bài báo ra khỏi nó bao gồm WTL
Pat

20

Tôi đã được nhiều người đã sử dụng cả hai cho biết rằng trải nghiệm lập trình của họ với ATL ít đau đớn hơn với MFC. Tập tin thực thi đã biên dịch của bạn cũng sẽ nhỏ hơn nhiều với ATL.

Tôi khuyên bạn nên xem xét WTL , vì nó được xây dựng dựa trên ATL.

"Chức năng bổ sung" mà họ tiếp tục đề cập là gì? Tôi có cần nó không?

Nếu bạn xác định các yêu cầu của mình, sẽ dễ dàng trả lời hơn nếu bạn có thể tránh sử dụng MFC. Thật không may, "không có gì lạ mắt" không đủ độc quyền. Bao gồm cả các tính năng bạn định sử dụng có thể hữu ích hơn (điều khiển nào, khung / công nghệ / thư viện hiện có nào bạn muốn sử dụng, v.v.).

Nhưng đây là bài viết mô tả một số tính năng trong MFC không được hỗ trợ trực tiếp bởi WTL / ATL.

MFC cũng đã phát triển đến mức nó hỗ trợ nhiều tính năng đáng mong đợi, chẳng hạn như MAPI, hỗ trợ các yêu cầu logo Windows khác, ổ cắm, tài liệu (nếu bạn thích và / hoặc sử dụng mẫu đó) và các tệp tài liệu kết hợp. WTL có những chia sẻ về các tính năng thú vị, nhưng MFC mới là nhà vô địch về tính năng rõ ràng. Cả hai môi trường đều hỗ trợ kiến ​​trúc cửa sổ chính được đóng khung (cửa sổ khung với cửa sổ xem riêng biệt), ứng dụng SDI và MDI, cửa sổ chia nhỏ, ứng dụng dựa trên hộp thoại và các lớp dựa trên COM khác nhau để hỗ trợ COM.


3
Câu trả lời của Jay có nhịp này. Để lại điều này cho liên kết đến bài viết giải thích một số sự khác biệt.
Merlyn Morgan-Graham

9

ATL là một tập hợp các lớp nhằm đơn giản hóa việc triển khai các đối tượng COM.

Bạn có thể sử dụng nó mà không cần MFC. Trong công việc của tôi, chúng tôi sử dụng ATL để hiển thị các giao diện COM với mã tính toán. Không có GUI liên quan, chúng tôi có thể gọi mã tính toán này từ ví dụ. VBA trong Excel.

Xem một số hướng dẫn / hướng dẫn COM để xem nó tóm tắt những gì.

MFC chỉ là một tập hợp các lớp trình bao bọc GUI cho Win32 API. Xem một số hướng dẫn về API Win32 để xem nó tóm tắt những gì.


ATL cũng có thể được sử dụng mà không cần đến COM. Nhiều lớp trong nó không liên quan đến COM, điều này thậm chí còn rõ ràng hơn khi nhìn vào WTL.
0xC0000022L

1
@ 0xC0000022L: Tôi không biết CWindowImplvà các bạn khi tôi viết cái này. Bây giờ tôi đã có nhiều kinh nghiệm hơn với ATL, tôi có thể thử viết lại câu trả lời này. Đặc biệt, ATL / WTL hầu như có thể thay thế tất cả MFC.
Alexandre C.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.