Từ sách Nội dung ATL, tôi biết BSTR khác với OLECHAR *, và có CComBSTR và CString cho BSTR.Chúng ta có nên xử lý loại BSTR trong COM dưới dạng giá trị hoặc tham chiếu không?
Theo MSDN Allocating and Releasing Memory for a BSTR, tôi biết trách nhiệm quản lý bộ nhớ đối với người gọi/callee.
Hãy dòng này từ MSDN,
HRESULT CMyWebBrowser::put_StatusText(BSTR bstr)
tôi vẫn không biết làm thế nào để xử lý bstr
đúng trong việc thực hiện của tôi. Vì tôi vẫn có một câu hỏi cơ bản cho BSTR - chúng ta có nên coi bstr
là một giá trị (như int) hay như một tham chiếu (như int *), ít nhất là trên ranh giới giao diện COM.
Tôi muốn chuyển đổi BSTR càng sớm càng tốt thành CString/CComBSTR trong quá trình triển khai. Giá trị hoặc ngữ nghĩa tham chiếu sẽ là trường hợp hoàn toàn khác cho chuyển đổi. Tôi đã đào vào CComBSTR.Attach, CComBSTR.AssignBSTR, vv Nhưng mã không thể giải quyết những nghi ngờ của tôi.
MSDN CComBSTR.Attach có một số mã snip, tôi cảm thấy nó sai vì nó không tuân theo Allocating and Releasing Memory for a BSTR. ATL Internals cho biết SetSysString sẽ 'giải phóng BSTR ban đầu được thông qua trong', nếu tôi sử dụng nó, nó sẽ vi phạm quy ước đối số BSTR, giống như CComBSTR.Attach. Tất cả trong tất cả, tôi muốn sử dụng CString để xử lý BSTR thô trong thực hiện, nhưng không biết chính xác cách ... Tôi đã viết một số mã chỉ trong các dự án của tôi, nhưng tôi luôn cảm thấy lo lắng vì tôi không Không biết tôi có đúng không.
Hãy để tôi nói chuyện với mã hóa ngôn ngữ
HRESULT CMyWebBrowser::put_StatusText(BSTR bstr)
{
// What I do NOT know
CString str1; // 1. copy bstr (with embeded NUL)
CString str2; // 2. ref bstr
// What I know
CComBSTR cbstr1;
cbstr1.AssignBSTR(bstr); // 3. copy bstr
CComBSTR cbstr2;
cbstr2.Attach(bstr); // 4. ref bstr, do not copy
// What I do NOT know
// Should we copy or ref bstr ???
}
Câu hỏi lớn của tôi là chúng ta nên sao chép hoặc ref bstr? Qeustion nhỏ là làm thế nào để ref bstr với CString? làm thế nào để sao chép bstr với nhúng NULL? – Raymond
Bạn có ý nghĩa gì với bản sao hoặc ref? Nếu đó là một tham số đầu vào vượt qua 'BSTR' theo giá trị, thì khác vượt qua" bằng con trỏ "' BSTR * '. Nếu bạn đã nhúng 'NUL', bạn có thể sao chép nó trong một 'std :: wstring', không phải trong' CString'. –
Có thể bạn đang quan sát vấn đề từ một quan điểm sai ... Hãy suy nghĩ về một 'BSTR' giống như một' const wchar_t * 'được cấp phát với một trình cấp phát COM đặc biệt và có độ dài tiền tố (để nó có thể nhúng' NUL '). –