2010-12-06 22 views
5

Tôi đang viết một dự án ATL và tôi tự hỏi làm thế nào tôi nên tạo các lớp học ở đây. Ngay bây giờ tôi có một lớp được tạo bởi Thêm/Class/ATL đối tượng đơn giản. Tôi muốn chia nó thành các lớp nhỏ hơn nhưng phương pháp từ lớp này nên sử dụng CComPtr và có CComPtr làm đối số. Tôi không thể tạo lớp C++ đơn giản vì tôi không có CComPtr ở đó.Tôi nên tạo các lớp học trong dự án ATL như thế nào?

Tôi có nên tạo các lớp ATL bằng ATL Simple Object Wizard và sau đó sử dụng giao diện cho lớp này để gọi các phương thức. Giống như ở đây:

CComPtr<ITestAtlClass> tptr; 
tptr.CoCreateInstance(CLSID_TestAtlClass); 
tptr->test(); 

Và tôi nên thêm tất cả các phương pháp công bằng Lớp Xem/ITestAtlClass/Add/Thêm Method? Còn về các nhà xây dựng thì sao? Tôi có phải khởi tạo lớp học của mình chỉ bằng các thuộc tính (và thêm chúng vào Chế độ xem Lớp học/ITestAtlClass/Add/Add Property)? Và vượt qua mọi đối tượng com bởi giao diện IUnknown?

Ai đó có thể cho tôi biết cách thực hiện trong dự án ATL. Tôi sẽ sử dụng lớp này nhỏ hơn trong nội bộ (không ai sẽ tạo ra các lớp này bên ngoài DLL của tôi) chỉ để làm cho mã của tôi dễ đọc hơn.

+2

Chỉ tạo các lớp ATL cho các giao diện sẽ hiển thị bên ngoài DLL. –

+0

@Hans Passant Nhưng tôi không thể tạo lớp C++ đơn giản đang sử dụng CComPtr chẳng hạn. Cách sử dụng? –

Trả lời

8

Tôi không hiểu nhận xét của bạn rằng bạn không thể sử dụng CComPtr từ một lớp C++ đơn giản. Bạn có thể làm rõ?

tôi thấy hai chiến lược:

  • xây dựng một C sạch ++ mô hình đối tượng mà giải quyết vấn đề, và sau đó quấn nó trong một lớp mặt tiền mỏng của một hoặc COM nhiều đối tượng
  • lớp
  • Sử dụng ATL suốt, và sử dụng CComObject<> và các dẫn xuất để khởi tạo và duy trì chúng mà không cần chi phí CoCreateInstance và các hạn chế chỉ sử dụng giao diện công cộng.

Đầu tiên thường đẹp hơn nhiều, nhưng nếu bạn đang xây dựng mô hình đối tượng dữ liệu nặng, thì thứ hai có thể là một kỹ thuật hữu ích.

Nếu bạn có một lớp ATL COM được gọi là CVehicle, có nguồn gốc từ CComObjectRootEx<> và bạn bè, bạn có thể khởi tạo nó như vậy;

CComObject<CVehicle>* vehicle = NULL; 
    CComObject<CVehicle>::CreateInstance(&vehicle); 

    vehicle->AddRef(); 

    // To get at any of its interfaces, use: 
    CComPtr<ICar> car = 0; 
    vehicle->QueryInterface(&car); 

    // And to delete object, use: 
    vehicle->Release(); 

Cũng có các biến thể trên CComObject<>, ví dụ: CComObjectStack<> sử dụng các chiến lược tính toán phân bổ và tham chiếu khác nhau.

Như bạn có thể thấy, điều này khá là lộn xộn. Nếu bạn có thể giải thích những gì bạn có ý nghĩa bằng cách bình luận của bạn về việc không thể sử dụng CComPtr, có lẽ tôi có thể mở rộng trên đó.

+0

Cảm ơn bạn rất nhiều !! Có vẻ như tôi không hiểu cách sử dụng các lớp ATL này. Bây giờ khi bạn chỉ cho tôi mẫu này tôi tìm thấy giống nhau trên [MSDN] (http://msdn.microsoft.com/en-us/library/9e31say1.aspx). Tôi có thể tạo các lớp ATL như vậy không ?: 'CComObject phương tiện; vehicle.someMethod() 'Vậy tôi sẽ không phải lo lắng về việc giải phóng bộ nhớ? Hoặc tôi có thể viết một cái gì đó như thế này: 'CComPtr >; CComObject :: CreateInstance (& vehicle); 'Và nó sẽ tự phát hành khi không cần thiết? –

+0

Khi tôi nói tôi không thể sử dụng CComPtr tôi không biết để tạo đối tượng ALT ... Tôi đã thử bao gồm 'atlcomcli.h' và' atlcom.h' vào lớp C++ bình thường (không có ATL Simple Object Wizard). Tôi hơi xấu hổ nhưng các tài nguyên ATL này không tuyệt vời. –

+0

Để tạo các đối tượng trên ngăn xếp, như bạn thấy, bạn sử dụng 'CComObjectStack <>'. Tôi không chắc chắn nếu một CComObjectStack có thể được nhúng bên trong một lớp khác như là một biến thành viên, bạn có thể muốn đọc lên trên các biến thể CComObject khác. –

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