UfcppSample icon indicating copy to clipboard operation
UfcppSample copied to clipboard

string と BSTR の互換性について

Open HoshizoraRin opened this issue 6 years ago • 2 comments

「小ネタ 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 バイト単位になっており、stringBSTR では長さの単位が違うと思います。

HoshizoraRin avatar Sep 17 '19 13:09 HoshizoraRin

ちょっと調査にお時間いただくかも…

ufcpp avatar Sep 21 '19 04:09 ufcpp

using System.Runtime.InteropServices;

unsafe
{
    var x = Marshal.StringToBSTR("あいうえお");
    var p = (int*)(x - 4);

    Console.WriteLine(*p);
}

これで10なので確かに…

ufcpp avatar May 09 '22 04:05 ufcpp