UfcppSample
UfcppSample copied to clipboard
string と BSTR の互換性について
「小ネタ string型のマーシャリング」 や Build Insider の記事の「Unicodeと、C#での文字列の扱い」 で、「C# の string は COM の BSTR と互換性がある」とされていますが、互換性がないのではと思いました。
理由は、Microsoft による BSTR の説明によると、BSTR の先頭に格納される長さ (Length prefix) は、「Unicode の文字列長 (UTF-16 の符号単位 = 2 バイト単位)」ではなく、「バイト数」となっているからです。実際に SysAllocString(L"aαあ") を実行して Length prefix を見てみると 6 になっています。
一方、C# の string の内部構造では、Build Insider の記事に書かれているとおり、2 バイト単位になっており、string と BSTR では長さの単位が違うと思います。
ちょっと調査にお時間いただくかも…
using System.Runtime.InteropServices;
unsafe
{
var x = Marshal.StringToBSTR("あいうえお");
var p = (int*)(x - 4);
Console.WriteLine(*p);
}
これで10なので確かに…