char *をSystem :: stringに変換してC++/CLIに戻すための承認された方法は何ですか?私はmarshal_to <のいくつかの参照をGoogleのテンプレート関数に見出しましたが、この機能はVisual Studio 2005のカットをしたことはありませんでした(そしてVisual Studio 2008、AFAIKではなく)。私もStan Lippman's blogにいくつかのコードを見ましたが、それは2004年のものです。Marshal :: StringToHGlobalAnsi()も見てきました。 「ベストプラクティス」と考えられる方法はありますか?C++/CLIでchar *とSystem :: Stringを変換する最も良い方法は何ですか
答えて
ここで良いの概要は、(このマーシャリングのサポートは、VS2008のために追加)あります: http://www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx
私たちが行ったことは、文字列をコードにしないで保持し、アイテムの管理されたコピーを与えるC++ \ CLIオブジェクトでした。変換コードはStanが自分のブログに持っているものと非常によく似ています(私はそれを覚えていません)(コードを使用するとdelete []を使うようにしてください)オブジェクトのアンマウントされた要素これは少し誇張されていますが、従来のC++コードモジュールに縛られても、漏れはありませんでした。
システム::文字列は、char *を取るコンストラクタがあります。
using namespace system;
const char* charstr = "Hello, world!";
String^ clistr = gcnew String(charstr);
Console::WriteLine(clistr);
*が帰ってきた文字を取得します少し難しくなりますが、それほど悪くはありません。
IntPtr p = Marshal::StringToHGlobalAnsi(clistr);
char *pNewCharStr = static_cast<char*>(p.ToPointer());
cout << pNewCharStr << endl;
Marshal::FreeHGlobal(p);
+1、System :: Stringコンストラクタも長さとエンコーディングをとる! –
'Marshal :: StringToHGlobalAnsi'は、RAIIを使ってバッファを自動的に解放する' marshal_context'(Matthewの言葉通り)と比較して劣っています。名前が完全に間違っていることは言うまでもなく、 'HGLOBAL'をまったく返しません。 –
私はいくつかのヘルパーメソッドを作成しました。古いQtライブラリからCLI Stringに移動するには、これを行う必要がありました。誰かがこれを追加して、私にメモリリークがあり、私がそれを修正するために何ができるのかを教えてくれたら、私は最も感謝しています。可能な方法の概要を
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;
}
おそらくMarshal :: FreeHGlobal(IntPtr((void *)chars));を必要とします。それは –
@Patはい申し訳ありません私はこれの後にこれを更新する必要があります。私は今それがうまくいくようにしました。 .NETに移行すると、このアプリのパフォーマンスが3倍向上しました。物事をマーシャリングすることさえある。 – dko
- 1. char-arrayをSystem :: Stringに変換する^
- 2. 'System :: String ^'を 'const char *'に変換するvC++
- 3. cassandraのハードドライブを交換する最も良い方法は何ですか
- 4. コレクションをロックする最も良い方法は何ですか?
- 5. std :: stringのサイズを変更する最も速い方法は何ですか?
- 6. codefirstでデータベーステーブルをモデルに変換する最も良い方法
- 7. コンテナを変換するときにフォントサイズのスケーリングを避ける最も良い方法は何ですか?
- 8. 文字列をmysqlの日付に変換する最も良い方法は何ですか?
- 9. ポーリングからイベントに変更する最も良い方法は何ですか?
- 10. AudioPitch withOutノイズを変更する最も良い方法は何ですか
- 11. c - char *配列をint型とfloat型に変換する最も効率的な方法は何ですか?
- 12. プロジェクトで最も良いバージョン管理方法は何ですか
- 13. R複数の変数を変換する最も良い方法は何ですか?
- 14. Django 1.5を学ぶ最も良い方法は何ですか?
- 15. NuSMVを学ぶ最も良い方法は何ですか?
- 16. jQueryを学ぶ最も良い方法は何ですか?
- 17. ブール変数を切り替える最も良い方法は何ですか?
- 18. 変数にkwh/yearを入れる最も良い方法は何ですか
- 19. C++で符号なしlongをchar *に変換する最も良い方法は
- 20. JuliaのIntをStringに変換する最適な方法は何ですか?
- 21. PicasaとJSFソフトウェアを統合する最も良い方法は何ですか?
- 22. 最も良い方法は何ですか
- 23. System :: Stringをunsigned char *に変換するにはどうすればよいですか?
- 24. ブラジルのレアをJavascriptを使用して番号に変換する最も良い方法は何ですか?
- 25. 共通のベクトルサイズタイプを使用する最も良い方法は何ですか?
- 26. フラッシュでオブジェクトをプログラムでスワップする最も良い方法は何ですか?
- 27. バイト配列をIntStreamに変換する最良の方法は何ですか?
- 28. Lorenz Systemをプロットする最も記述的な方法は何ですか?
- 29. オブジェクトをSQLiteレコードに "変換"する最良の方法は何ですか?
- 30. リレーショナルをオブジェクト指向に変換する最良の方法は何ですか?
おかげで、それは長い説明です。これは、次のようになります。 '#include // marshal_context context; // my_c_string = context.marshal_as (my_csharp_string); ' –
gatopeich
コンテキストの完全な名前空間は' msclr :: interop :: marshal_context'です – Mugen