45

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

4

5 に答える 5

75

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);
于 2008-09-11T14:57:34.743 に答える
18

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

于 2008-09-11T14:34:28.433 に答える
0

私たちが行ったことは、管理されていないコードで文字列を保持し、項目の管理されたコピーを提供する C++\CLI オブジェクトを作成することでした。変換コードは、Stan が彼のブログに書いているものと非常によく似ています (正確には思い出せません) (彼のコードを使用する場合は、delete[] を使用するように更新してください)。オブジェクトの管理されていない要素。これは少し誇張されていますが、従来の C++ コード モジュールに結合したときにリークはありませんでした。

于 2008-09-11T13:58:17.210 に答える
0

いくつかのヘルパー メソッドを作成しました。古い 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;
}
于 2011-06-01T17:14:19.477 に答える
-1

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

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

于 2013-05-25T17:00:01.130 に答える