Bạn có thể cung cấp ví dụ thông qua so sánh cho thấy lợi ích của ATL không?Tại sao mọi người sử dụng ATL cho lập trình COM?
Trả lời
Nhà phát triển lười biếng và thích những thứ dễ dàng hơn những thứ khó khăn và ATL được thiết kế để giúp phát triển COM dễ dàng hơn.
Trong hầu hết các trường hợp ATL quản lý nhiều chi tiết lộn xộn về phát triển COM, như quản lý QueryInterface, tính tham chiếu và quản lý lâu dài và tất cả các mô hình luồng khác nhau mà COM hỗ trợ. Nó cũng cung cấp hỗ trợ tích hợp cho những thứ như giao diện kép, điểm kết nối, điều tra, v.v.
Nếu bạn không sử dụng ATL, hoặc giống như vậy, bạn sẽ viết nhiều mã hơn. Đó sẽ là đáng tiếc;)
Edit:
Tôi sẽ không viết bất kỳ mã COM mà không ATL cho một ví dụ vì nó là như vậy khủng khiếp để làm như vậy, nhưng hãy kiểm tra này:
http://www.codeproject.com/KB/COM/simplecomserver.aspx
Tải đó và sau đó nhìn vào các tập tin sau đây theo dự án simplecomserver:
registry.cpp
simplecomserverImpl.cpp
(khoảng 700 dòng mã)
Bây giờ tưởng tượng rằng thay vì viết tất cả các quái vật đó, bạn có thể lấy được một lớp từ CCoComClass và chỉ cần thực hiện các phương pháp Name, và sau đó thực hiện điều này để xử lý phân loại và đăng ký lớp học:
// Used to determine whether the DLL can be unloaded by OLE
STDAPI DllCanUnloadNow(void)
{
return _AtlModule.DllCanUnloadNow();
}
// Returns a class factory to create an object of the requested type
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
}
// DllRegisterServer - Adds entries to the system registry
STDAPI DllRegisterServer(void)
{
// registers object, typelib and all interfaces in typelib
HRESULT hr = _AtlModule.DllRegisterServer();
return hr;
}
// DllUnregisterServer - Removes entries from the system registry
STDAPI DllUnregisterServer(void)
{
HRESULT hr = _AtlModule.DllUnregisterServer();
return hr;
}
Có vẻ như bạn muốn một số ví dụ cụ thể về nơi ATL đơn giản hóa chương trình COM; sau đây là những gì đã xảy ra với tôi.
CComObjectRootEx
: Bằng cách thừa kế các lớp COM của bạn từCComObjectRootEx
, bạn sẽ có được thread-safe tham khảo-đếm miễn phí.CComCoClass
: Lớp cơ sở này thực hiện tất cả các phương pháp để khởi tạo lớp học của bạn, bao gồm các công cụIClassFactory
được yêu cầu cho khách hàng sử dụngCoGetClassObject
với thành phần của bạn.COM_INTERFACE_ENTRY
macro: ATL cung cấp một bó toàn bộ các macro để sử dụng giữaBEGIN_COM_MAP
vàEND_COM_MAP
, mà bạn có thể sử dụng để thực hiện can đảm củaIUnknown::QueryInterface
theo cách chính xác cho yêu cầu của bạn, bất cứ điều gì họ có thể.IDispatchImpl
: Nếu bạn muốn các thành phần của mình có thể truy cập được vào tập lệnh, bạn phải triển khaiIDispatch
. ATL cung cấp các lớp họcIDispatchImpl
, giúp tiết kiệm những rắc rối của việc thực hiện nó cho mình.CComPtr
/CComQIPtr
: ATL cung cấp các lớp con trỏ thông minh, mà tóm lược các cuộc gọi đếnIUnknown::AddRef
,IUnknown::Release
vàIUnknown::QueryInterface
.Sử dụng chúng sẽ làm cho mã của bạn dễ đọc và dễ bị lỗi tham chiếu COM hơn.CComBSTR
/CComVariant
: ATL cung cấp các lớp này, làm giảm độ phức tạp khi xử lý các loại COMBSTR
vàVARIANT
COM.
- 1. Tại sao mọi người không sử dụng <CFLOGIN>?
- 2. Liệt kê các phương thức COM (IDispatch) bằng cách sử dụng ATL?
- 3. Tại sao chúng ta sử dụng radian trong lập trình?
- 4. Tại sao mọi người không thích chú thích?
- 5. Tại sao sử dụng hằng số trong lập trình?
- 6. Tại sao mọi người gọi jQuery $ alias là 'nhà máy'?
- 7. Pthread: Tại sao mọi người lại bận tâm sử dụng pthread_exit?
- 8. Tại sao mọi người sử dụng i = i + 1 thay vì i + +?
- 9. Tại sao mọi người không ngừng phát triển các trang web để phục vụ cho IE6?
- 10. Tại sao mọi người liên tục khuyên bạn nên sử dụng appConfig thay vì sử dụng tệp Cài đặt? (.NET)
- 11. Tại sao mọi người sử dụng enums trong C++ như hằng số trong khi họ có thể sử dụng const?
- 12. Nếu SqlDataAdapter sử dụng trình đọc dữ liệu nội bộ, tại sao mọi người nói rằng sử dụng SqlDataReader nhanh hơn?
- 13. Sử dụng lập trình Python cho iOS
- 14. Hướng dẫn lập trình COM (C++)?
- 15. tại sao KHÔNG MỌI MỌI mặc định là UTF-8?
- 16. Tại sao tôi nên học COM?
- 17. Tại sao "android:" ở khắp mọi nơi?
- 18. Tại sao lập trình hàm tốt?
- 19. Mọi người giải quyết các cuộc thi lập trình nhanh như thế nào?
- 20. Tại sao mọi người nghĩ rằng người duy nhất tạo ra C++ là Bjarne Stroustrup?
- 21. tại sao không sử dụng Thread.Sleep không có lý do, và giải thích cho một lập trình viên
- 22. Tại sao sử dụng NSObjectController
- 23. Tại sao bạn sử dụng umask?
- 24. Tại sao một người sử dụng "git merge -s ours"?
- 25. Tại sao một người sử dụng lại 'undefined`?
- 26. Tại sao mọi người nói rằng Java có khả năng mở rộng hơn so với python?
- 27. Sử dụng cùng một trình mô phỏng android mọi lúc
- 28. Tại sao sử dụng AMQP/ZeroMQ/RabbitMQ
- 29. Đăng ký một C#/VB.NET COM dll theo lập trình
- 30. Cho phép người sử dụng một phiên bản sandbox của một ngôn ngữ lập trình
So sánh với những gì? – Johnsyweb
Để không sử dụng ATL. – wamp