2010-07-23 13 views
5

Tôi đang cố gắng chuyển đổi một số wchar_t * thành BSTR.C++: Chuyển đổi wchar_t * thành BSTR?

#include <iostream> 
#include <atlstr.h> 

using namespace std; 

int main() 
{ 
    wchar_t* pwsz = L"foo"; 

    BSTR bstr(pwsz); 

    cout << SysStringLen(bstr) << endl; 

    getchar(); 
} 

Điều này in 0, ít hơn những gì tôi hy vọng. Cách chính xác để thực hiện chuyển đổi này là gì?

Trả lời

9

Bạn cần sử dụng SysAllocString (và sau đó là SysFreeString).

BSTR bstr = SysAllocString(pwsz); 

// ... 

SysFreeString(bstr); 

A BSTR là chuỗi được quản lý có các ký tự của chuỗi được đặt trước theo độ dài của chúng. SysAllocString phân bổ dung lượng lưu trữ chính xác và thiết lập độ dài và nội dung của chuỗi chính xác. Với số BSTR được khởi tạo chính xác, SysStringLen phải trả về độ dài chính xác.

Nếu bạn đang sử dụng C++, bạn có thể muốn xem xét sử dụng lớp phong cách RAII (hoặc thậm chí là _bstr_t của Microsoft) để đảm bảo rằng bạn không quên bất kỳ cuộc gọi nào SysFreeString.

1

Tôi nghĩ đơn giản nhất là một trong hai để sử dụng

CString

hoặc

CComBSTR

cả hai đều có phương pháp mà làm những gì Charles nêu

+1

'CString' không _wrap_ một' BSTR', mặc dù nó có một phương pháp để phân bổ một 'BSTR' từ một' CString' ('.AllocSysString()'). 'CString' không hỗ trợ tự động giải phóng' BSTR'. –

+0

cũng theo nghĩa nó kết thúc tốt đẹp các chức năng để chuyển đổi sang một BSTR đó là những gì OP muốn, nhưng về mặt kỹ thuật bạn là chính xác để lựa chọn các từ của tôi là không đúng. –

2

SysStringLen() nên chỉ được sử dụng trên BSTRs phân bổ bởi SysAllocString() chức năng gia đình. Sử dụng nó như bạn làm sẽ dẫn đến hành vi không xác định - chương trình có thể sụp đổ hoặc tạo ra kết quả bất ngờ. Sử dụng tốt hơn các lớp trình bao bọc - ATL::CComBSTR hoặc _bstr_t.