只是字節組合來「編碼」數據的方式嗎?COM字符串(BSTR)和.NET字符串有什麼區別?
我很好奇,因爲我想知道RCW如何自動獲取.NET字符串並將其轉換爲COM BSTR。我猜它只是形成一個有效的COM BSTR從.NET字符串轉換而來。
相關:我可以使用.NET中的字節類型構造自己的有效BSTR嗎?
只是字節組合來「編碼」數據的方式嗎?COM字符串(BSTR)和.NET字符串有什麼區別?
我很好奇,因爲我想知道RCW如何自動獲取.NET字符串並將其轉換爲COM BSTR。我猜它只是形成一個有效的COM BSTR從.NET字符串轉換而來。
相關:我可以使用.NET中的字節類型構造自己的有效BSTR嗎?
這兩種字符串類型完全沒有關係。必須進行轉換才能將一種類型轉換爲另一種類型。
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好:
感謝joncham 。很有幫助。我想我只是想知道如果我檢查了位和字節,這些差異會是什麼。他們都存儲在某個地方。它們都代表着某種東西他們不只是代表同一事物的不同位和字節(一串字符?) – richard
是的,所有數據都只是字節;-)。問題是誰分配/取消分配這些字節,以及在佈置這些字節時使用的約定。例如,在分配一個BSTR時,實際上並不檢索指向分配內存開始的指針。由於前四個字節存儲字符串的長度,因此您的指針在分配的空間中是4個字節。 – joncham
@Richard DesLonde:是的,他們都是人物陣列。然而,你不能真的使用任何字符串作爲'System.String',因爲任何'System.String'的構造函數都會將字符數組複製到另一個內存位置。 – codekaizen