C ++/CLIでString^の内部配列へのポインターを取得することは可能ですか?

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

  •  27-09-2019
  •  | 
  •  

質問

目標は、必要なときに文字列データのコピーを避けることです 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ポインターを取得する」と説明されています。

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