C++でaを表す値である
StringHandle
フィールドを持つクラスを使用しています。IntPtr
LPCWSTR
internal IntPtr StringHandle; // LPCWSTR
私は文字列を持っていると言います:string x = "abcdefg"
文字列ハンドルを使用して文字列の先頭を指し、C ++ LPCWSTRのようにするにはどうすればよいですか?
最初に文字列をアンマネージメモリにコピーしてIntPtr
から、その場所からを取得する必要があります。あなたは次のようにそうすることができます:
IntPtr strPtr = Marshal.StringToHGlobalUni(x);
また、アンマネージメモリを必ず解放する必要があります。
Marshal.FreeHGlobal(strPtr);
これをすべて試して/最後に行うのが最善です。
ガベージコレクタがヒープを圧縮すると、管理対象文字列はメモリ内を移動します。そのため、安定したアドレスがなく、LPCWSTRに直接キャストすることはできません。GCHandle.AddrOfPinnedObjectを使用するには、GCHandle.Alloc()を使用して文字列を固定するか、Marshal.StringToHGlobalUni()を使用してアンマネージメモリに文字列をコピーする必要があります。
アドレスをしばらく安定させる必要がある場合は、コピーすることを強くお勧めします。
Marshal
クラスでStringTo*メソッドの1つを使用したい