C++/CLI で char* と System::String の間で変換する最良の方法は何ですか?
質問
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;
}
考えられる方法の概要への追加リンク: