C ++/CLIでString^の内部配列へのポインターを取得することは可能ですか?
質問
目標は、必要なときに文字列データのコピーを避けることです const wchar_t*
.
答えはイエスのようですが、機能 PtrToStringChars
独自のMSDNエントリはありません(KBとブログでのみトリックとして言及されています)。それは私を疑わせ、私はあなたたちにチェックしたいです。その機能を使用しても安全ですか?
解決
はい、問題ありません。実際にはややです 文書化 しかし、見つけるのは難しいです。 C ++ライブラリのMSDNドキュメントはあまりありません。内部ポインターを返しますが、これはconst wchar_t*への変換にはまだ適していません。ゴミコレクターが文字列を動かすことができないように、ポインターをピン留めする必要があります。 PIN_PTR <>を使用してそれを行います。
Marshal :: Stringtohglobaluni()を使用して、文字列のコピーを作成できます。 wchar_t*が長期間有効である必要がある場合は、代わりにそれを使用してください。オブジェクトを長く固定することは、ゴミコレクターにとってあまり健康ではありません。
他のヒント
これは、管理された文字列内部にアクセスし、標準のC関数を使用してコンテンツをコピーするptrtoStringcharsに基づく完全なソリューションです。
wchar_t *ManagedStringToUnicodeString(String ^s)
{
// Declare
wchar_t *ReturnString = nullptr;
long len = s->Length;
// Check length
if(len == 0) return nullptr;
// Pin the string
pin_ptr<const wchar_t> PinnedString = PtrToStringChars(s);
// Copy to new string
ReturnString = (wchar_t *)malloc((len+1)*sizeof(wchar_t));
if(ReturnString)
{
wcsncpy(ReturnString, (wchar_t *)PinnedString, len+1);
}
// Unpin
PinnedString = nullptr;
// Return
return ReturnString;
}
この記事によると: http://support.microsoft.com/kb/311259 PtrtoStringcharsは正式にサポートされており、使用できます。 vcclr.hの「システム:: stringオブジェクトに含まれる最初の文字へのインテリアGCポインターを取得する」と説明されています。
所属していません StackOverflow