2010-09-07 28 views

Trả lời

3

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; 
} 
+0

Bạn có thể cung cấp một ví dụ không? – wamp

+0

Ví dụ về cái gì? – Gerald

+0

Sử dụng ATL để dễ dàng phát triển? – wamp

7

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ụng CoGetClassObject 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ữa BEGIN_COM_MAPEND_COM_MAP, mà bạn có thể sử dụng để thực hiện can đảm của IUnknown::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 khai IDispatch. ATL cung cấp các lớp học IDispatchImpl, 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 đến IUnknown::AddRef, IUnknown::ReleaseIUnknown::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 COM BSTRVARIANT COM.

+0

Tôi cần bao gồm các tệp/thư viện tiêu đề nào để sử dụng ATL? – wamp

+1

Điều đó nghe giống như một câu hỏi riêng biệt ..... :) –

+0

Tôi vẫn cần gọi 'CoInitialize (NULL) 'và' CoUninitialize() 'nếu tôi chuyển sang ** ATL **? – wamp

Các vấn đề liên quan