2008-09-11 9 views
40

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を変換する最も良い方法は何ですか

答えて

18

ここで良いの概要は、(このマーシャリングのサポートは、VS2008のために追加)あります: http://www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx

+7

おかげで、それは長い説明です。これは、次のようになります。 '#include // marshal_context context; // my_c_string = context.marshal_as (my_csharp_string); ' – gatopeich

+0

コンテキストの完全な名前空間は' msclr :: interop :: marshal_context'です – Mugen

1

私たちが行ったことは、文字列をコードにしないで保持し、アイテムの管理されたコピーを与えるC++ \ CLIオブジェクトでした。変換コードはStanが自分のブログに持っているものと非常によく似ています(私はそれを覚えていません)(コードを使用するとdelete []を使うようにしてください)オブジェクトのアンマウントされた要素これは少し誇張されていますが、従来のC++コードモジュールに縛られても、漏れはありませんでした。

70

システム::文字列は、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); 
+4

+1、System :: Stringコンストラクタも長さとエンコーディングをとる! –

+5

'Marshal :: StringToHGlobalAnsi'は、RAIIを使ってバッファを自動的に解放する' marshal_context'(Matthewの言葉通り)と比較して劣っています。名前が完全に間違っていることは言うまでもなく、 'HGLOBAL'をまったく返しません。 –

1

私はいくつかのヘルパーメソッドを作成しました。古い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; 
} 
+0

おそらくMarshal :: FreeHGlobal(IntPtr((void *)chars));を必要とします。それは –

+0

@Patはい申し訳ありません私はこれの後にこれを更新する必要があります。私は今それがうまくいくようにしました。 .NETに移行すると、このアプリのパフォーマンスが3倍向上しました。物事をマーシャリングすることさえある。 – dko

関連する問題