2011-06-21 32 views
5

Chỉ là cách các byte được kết hợp để "mã hóa" dữ liệu?Sự khác nhau giữa một chuỗi COM (BSTR) và một chuỗi .NET là gì?

Tôi tò mò vì tôi tự hỏi làm thế nào một RCW tự động lấy một chuỗi .NET và biến nó thành một COM BSTR. Tôi đoán nó chỉ tạo thành một COM BSTR hợp lệ được chuyển đổi từ chuỗi .NET.

Liên quan: Tôi có thể tạo BSTR hợp lệ của riêng mình bằng cách sử dụng loại byte trong .NET không?

Trả lời

9

Hai loại chuỗi không liên quan gì cả. Một chuyển đổi phải xảy ra để chuyển đổi một loại khác.

BSTR có một số quy ước phải được tuân theo trong đó bao gồm được phân bổ qua SysAllocString *, deallocated với SysFreeString, có tiền tố độ dài và một terminator của hai ký tự null.

http://msdn.microsoft.com/en-us/library/ms221069.aspx

Một Net chuỗi là một kiểu quản lý mà được phân bổ qua các đống quản lý. Tuổi thọ của nó được quản lý bởi bộ thu gom rác CLR.

Để xây dựng BSTR của riêng bạn, nó sẽ là tốt hơn để sử dụng Marshal.StringToBSTR:

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.stringtobstr.aspx

Nếu đó là không đủ, bạn có thể PInvoke SysAllocString tốt:

http://msdn.microsoft.com/en-us/library/ms221458.aspx

+0

Cảm ơn joncham . Rất hữu ích. Tôi đoán tôi chỉ tự hỏi điều gì sẽ khác biệt nếu tôi kiểm tra các bit và byte. Cả hai đều được lưu trữ ở đâu đó. Cả hai đều đại diện cho một cái gì đó. Không phải họ chỉ khác nhau bit và byte để đại diện cho cùng một điều (một chuỗi ký tự?) – richard

+2

Có, tất cả dữ liệu chỉ là byte ;-). Vấn đề là ai phân bổ/deallocates những byte, và các quy ước được sử dụng khi đặt ra những byte. Ví dụ, khi phân bổ một BSTR bạn không thực sự lấy một con trỏ đến đầu của bộ nhớ được cấp phát. Con trỏ của bạn là 4 byte vào không gian được phân bổ, vì bốn byte đầu tiên lưu trữ độ dài của chuỗi. – joncham

+0

@Richard DesLonde: yea, chúng là cả hai mảng ký tự. Tuy nhiên, bạn không thể sử dụng bất kỳ chuỗi ký tự nào làm 'System.String', vì bất kỳ hàm tạo nào cho' System.String' sẽ sao chép mảng ký tự vào một vị trí bộ nhớ khác. – codekaizen

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