PInvoked OpenFileDialog(GetOpenFileName関数)から文字列のアンマネージ配列をマーシャリング

StackOverflow https://stackoverflow.com/questions/667049

質問

OpenFileDialogは、配列の終わりを示すために、最終的なヌル続いヌルで終了する文字列の配列を含むメモリへのポインタを戻します。

これは、私が戻っているアンマネージポインタからC#の文字列を取得していますが、私はより安全、よりエレガントな方法が存在しなければならないと確信している方法です。

            IntPtr unmanagedPtr = // start of the array ...
            int offset = 0;
            while (true)
            {
                IntPtr ptr = new IntPtr( unmanagedPtr.ToInt32() + offset );
                string name = Marshal.PtrToStringAuto(ptr);
                if(string.IsNullOrEmpty(name))
                    break;

                // Hack!  (assumes 2 bytes per string character + terminal null)
                offset += name.Length * 2 + 2;
            }
役に立ちましたか?

解決

あなたはかなり良いルックスをやっている - 。私はなるだろう唯一の変更ではなくEncoding.Unicode.GetByteCount(name)name.Length * 2を使用することです(これは何が起こっているだけよりは明らかだ)

また、あなたはあなたの管理されていないデータがUnicodeであることを肯定している場合、それはあなたの文字列エンコーディングについての曖昧さを取り除くよう、Marshal.PtrToStringUni(ptr)を使用する場合があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top