20

C++でaを表す値である StringHandleフィールドを持つクラスを使用しています。IntPtrLPCWSTR

internal IntPtr StringHandle; // LPCWSTR

私は文字列を持っていると言います:string x = "abcdefg"

文字列ハンドルを使用して文字列の先頭を指し、C ++ LPCWSTRのようにするにはどうすればよいですか?

4

3 に答える 3

35

最初に文字列をアンマネージメモリにコピーしてIntPtrから、その場所からを取得する必要があります。あなたは次のようにそうすることができます:

IntPtr strPtr = Marshal.StringToHGlobalUni(x);

また、アンマネージメモリを必ず解放する必要があります。

Marshal.FreeHGlobal(strPtr);

これをすべて試して/最後に行うのが最善です。

于 2012-06-18T20:25:25.913 に答える
7

ガベージコレクタがヒープを圧縮すると、管理対象文字列はメモリ内を移動します。そのため、安定したアドレスがなく、LPCWSTRに直接キャストすることはできません。GCHandle.AddrOfPinnedObjectを使用するには、GCHandle.Alloc()を使用して文字列を固定するか、Marshal.StringToHGlobalUni()を使用してアンマネージメモリに文字列をコピーする必要があります。

アドレスをしばらく安定させる必要がある場合は、コピーすることを強くお勧めします。

于 2012-06-18T20:29:55.280 に答える
1

MarshalクラスでStringTo*メソッドの1つを使用したい

于 2012-06-18T20:23:26.620 に答える