2011-06-21 15 views
5

バイトを組み合わせてデータを「エンコード」するのは単なる方法ですか?COM文字列(BSTR)と.NET文字列の違いは何ですか?

RCWが自動的に.NET文字列を受け取り、それをCOM BSTRに変換する方法が不思議です。私はそれがちょうど.NET文字列から変換された有効なCOM BSTRを形成すると推測しています。

関連:.NETでバイトタイプを使用して自分の有効なBSTRを構築できますか?

答えて

9

2つの文字列型はまったく関係ありません。あるタイプを別のタイプに変換するには、変換が必要です。

BSTRには、SysAllocString *を介して割り当て、SysFreeStringで割り当て解除する、長さ接頭辞を持つ、および2つのヌル文字のターミネータを含むことに従わなければならない多数の規則があります。

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

純列は、管理ヒープを介して割り当てられている管理型です。ライフタイムはCLRガベージコレクタによって管理されます。

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

+0

おかげでjoncham:それは十分にあなたがSysAllocStringのPInvokeできる良いではない場合

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

は、使用することをMarshal.StringToBSTRずっと良いだろうあなた自身のBSTRを構築するために。非常に役立ちます。私はちょうど私がビットとバイトを調べれば、違いがどうなるのだろうかと思っています。彼らはどちらもどこかに格納されます。彼らはどちらも何かを表しています。同じもの(文字列ですか?)を表現するのに異なるビットとバイトではありませんか? – richard

+2

はい、すべてのデータは単なるバイトです;-)。問題は、それらのバイトを割り当てる/解放する人と、それらのバイトをレイアウトするときに使用される規則です。たとえば、BSTRを割り当てるときには、実際に割り当てられたメモリの先頭へのポインタを取得しません。最初の4バイトは文字列の長さを格納するため、ポインタは割り当てられたスペースに4バイトです。 – joncham

+0

@Richard DesLonde:確かに、どちらも文字の配列です。しかし、 'System.String'のコンストラクタは文字配列を別のメモリ位置にコピーするので、本当に文字列を' System.String'として使用することはできません。 – codekaizen

関連する問題