C++/CLI で char* と System::String の間で変換する最良の方法は何ですか?

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

  •  09-06-2019
  •  | 
  •  

質問

char* から System::string に変換し、C++/CLI に戻す承認された方法は何ですか?Google で marshal_to<> テンプレート関数への参照をいくつか見つけましたが、この機能は Visual Studio 2005 では採用されなかったようです (私の知る限り、Visual Studio 2008 にもありません)。いくつかのコードも見ました スタン・リップマンのブログ, でも2004年の話です。Marshal::StringToHGlobalAnsi() も見ました。「ベストプラクティス」と考えられる方法はありますか?

役に立ちましたか?

解決

ここに概要があります (このマーシャリング サポートは VS2008 に追加されました)。http://www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx

他のヒント

System::String には、char* を受け取るコンストラクターがあります。

 using namespace system;
 const char* charstr = "Hello, world!";
 String^ clistr = gcnew String(charstr);
 Console::WriteLine(clistr);

char* を取り戻すのは少し難しくなりますが、それほど悪いことではありません。

 IntPtr p = Marshal::StringToHGlobalAnsi(clistr);
 char *pNewCharStr = static_cast<char*>(p.ToPointer());
 cout << pNewCharStr << endl;
 Marshal::FreeHGlobal(p);

私たちが行ったのは、マンガ化されていないコードで文字列を保持し、項目の管理されたコピーを提供する C++\CLI オブジェクトを作成したことです。変換コードは Stan のブログにあるものとよく似ています (正確には思い出せません) (彼のコードを使用する場合は、delete[] を使用するように必ず更新してください)。ただし、デストラクターがすべての解放を処理するようにしました。オブジェクトの管理されていない要素。これは少し大げさですが、レガシー C++ コード モジュールに結合したときにリークは発生しませんでした。

いくつかのヘルパー メソッドを作成しました。古い Qt ライブラリから CLI 文字列に移行するには、これを行う必要がありました。誰かがこれに追加して、メモリリークがあるように見えるかどうか、そしてそれを修正するために何ができるかを教えていただければ、私は非常に感謝します。

void MarshalString (  String ^ s, wstring& os ) {
    using namespace Runtime::InteropServices;
    const wchar_t* char = (const wchar_t*)(Marshal::StringToHGlobalUni(s)).ToPointer();
    os = char;
}
QString SystemStringToQt( System::String^ str)
{
    wstring t;
    MarshalString(str, t);
    QString r = QString::fromUcs2((const ushort*)t.c_str());
    return r;
}

考えられる方法の概要への追加リンク:

http://support.microsoft.com/?kbid=311259

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