2010-02-18 5 views
17

Tôi đang sử dụng ATL (VS2008, vì vậy ATL9 IIRC) để tạo đối tượng COM và đã sử dụng lớp CComVariant (được định nghĩa trong atlcomcli.h) để quản lý các loại VARIANT. Tuy nhiên, cũng có một trình bao bọc VARIANT khác được gọi là _variant_t. Có sự khác biệt nào giữa CComVariant_variant_t và tôi nên sử dụng loại nào?CComBariant so với _variant_t, CComBSTR so với _bstr_t

Tương tự, có hai bao bì BSTR có sẵn - CComBSTR_bstr_t. Một lần nữa, tôi nên thích điều gì và tại sao?

Trả lời

15

_variant_t và _bstr_t được trình biên dịch cung cấp dưới dạng COM support classes và được sử dụng khi bạn sử dụng các cấu trúc như #import. Bạn có thể sử dụng chúng nếu bạn muốn.

CComVariant và CComBSTR được cung cấp bởi ATL libraries.

Cho dù bạn sử dụng các lớp Hỗ trợ COM hay các lớp học ATL phụ thuộc vào bạn. Nếu bạn thường cần thực hiện các thao tác như gắn BSTR hoặc VARIANT 'thô', thì các lớp Hỗ trợ COM có thể là đặt cược an toàn hơn.

Có một số khác biệt về hành vi (kiểm tra tài liệu), quan trọng nhất trong số đó có vẻ là các lớp hỗ trợ COM sẽ ném một ngoại lệ _com_error & khi có lỗi. Nếu bạn không muốn thực hiện xử lý ngoại lệ, hãy đi với các lớp ATL.

+0

Lưu ý rằng _variant_t và _bstr_t được cung cấp miễn phí trong SDK. ATL được cung cấp với MSDN và được trả tiền. – Ben

+0

+1 cho thông tin đính kèm. Bạn có thể gói gọn một 'BSTR bstr' hiện có hoặc là' _bstr_t my_bstr (bstr, false) 'hoặc' CComBSTR my_bstr; my_bstr.Attach (bstr); 'vì vậy nếu bạn chỉ cần hủy BSTR tự động,' _bstr_t' đơn giản hơn. –

0

BSTR và VARIANT là các kiểu dữ liệu được bao bọc bởi các lớp CComBSTR/_bstr_t và CComVariant/_variant_t.
Vì vậy, như đã nêu trước khi các lớp học cung cấp thêm phương pháp, vv

7

Một điểm khác biệt chính là các lớp của ATL không ném ngoại lệ và các lớp hỗ trợ trình biên dịch (_com_exception).

_bstr_t được tham chiếu trong khi CComBSTR là một trình bao bọc thô hơn.

+2

+1 Tôi muốn nói rằng đây là điểm khác biệt chính. Với ATL bạn phải viết rất nhiều mã kiểm tra lỗi bổ sung. Ở phía bên kia nếu bạn không muốn làm phiền với các ngoại lệ, bạn nên chọn các lớp ATL. – sharptooth

1

Tôi sử dụng cả hai tùy thuộc vào nhiệm vụ trong tầm tay. Như đã nêu trước đó _variant_t và _bstr_t là cơ bản hơn trong khi các lớp ATL có mức độ cao hơn (đối ứng tốt hơn với MFC). Lời khuyên của tôi là xem xét một chút các định nghĩa của các lớp. Tất cả chúng chỉ là những người trợ giúp cho mã nhỏ hơn, dễ đọc hơn nhưng vẫn chứa đựng những cạm bẫy nhất định liên quan đến việc quản lý bộ nhớ và tham chiếu đối tượng. Vì vậy, bạn phải biết một chút về nội bộ của họ và tài liệu thường không rõ ràng về điều đó.

+0

+1 Điều này thực sự là trường hợp khi chi tiêu một giờ đọc nguồn cung cấp cho bạn sự hiểu biết tốt hơn nhiều. – sharptooth