2011-06-21 61 views
5

只是字節組合來「編碼」數據的方式嗎?COM字符串(BSTR)和.NET字符串有什麼區別?

我很好奇,因爲我想知道RCW如何自動獲取.NET字符串並將其轉換爲COM BSTR。我猜它只是形成一個有效的COM BSTR從.NET字符串轉換而來。

相關:我可以使用.NET中的字節類型構造自己的有效BSTR嗎?

回答

9

這兩種字符串類型完全沒有關係。必須進行轉換才能將一種類型轉換爲另一種類型。

BSTR有許多約定必須遵循,包括通過SysAllocString *分配,使用SysFreeString釋放,具有長度前綴和兩個空字符的終止符。

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

一個.NET字符串是經由管理堆中分配一個管理型。它的生命週期由CLR垃圾收集器管理。

要構建自己的BSTR,這將是更好的使用Marshal.StringToBSTR:

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

如果這還不夠,你可以的PInvoke SysAllocString好:

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

+0

感謝joncham 。很有幫助。我想我只是想知道如果我檢查了位和字節,這些差異會是什麼。他們都存儲在某個地方。它們都代表着某種東西他們不只是代表同一事物的不同位和字節(一串字符?) – richard

+2

是的,所有數據都只是字節;-)。問題是誰分配/取消分配這些字節,以及在佈置這些字節時使用的約定。例如,在分配一個BSTR時,實際上並不檢索指向分配內存開始的指針。由於前四個字節存儲字符串的長度,因此您的指針在分配的空間中是4個字節。 – joncham

+0

@Richard DesLonde:是的,他們都是人物陣列。然而,你不能真的使用任何字符串作爲'System.String',因爲任何'System.String'的構造函數都會將字符數組複製到另一個內存位置。 – codekaizen

相關問題