1

VS6.0からVS2008に移行したばかりのかなり大きなMFCアプリケーションがあります。これはかなり骨の折れるプロセスでしたが、今度は利用可能なマネージコードオプションを調べたいと思います。/ clrスイッチを使用してプロジェクトを正常にビルドできました。これにより、管理対象タイプにアクセスできるようになります。

System::StringとCStringの間の変換が自動かどうか知りたいのですが。私が見つけたMSDNのドキュメントは、この変換が自動ではないことを示唆していますが、これが当てはまるとは思いませんでした。以下の3つの例はすべて機能し、1と2の両方がMSDNによって文書化されています。私が興味を持っているのは例3です。これも機能しますが、理由はわかりません。CurrentDirectoryプロパティは、マネージヒープString ^にポインタを返しますが、なぜそれをCStringに割り当てることができるのですか?例3は正確に何をしていて、メモリ管理にどのような影響がありますか?

例1)

    marshal_context ^ context = gcnew marshal_context();
    文字列^env= System :: Environment :: CurrentDirectory;
    const char * env2 = context-> marshal_as(env);
    AfxMessageBox(env2);
    コンテキストを削除します。

例2)

    CString s(System :: Environment :: CurrentDirectory);
    AfxMessageBox(s);

例3)

    CString s = System :: Environment :: CurrentDirectory;
    AfxMessageBox(s);
4

2 に答える 2

3

オプション 3 は、オプション 2 とほとんど同じ理由で機能します。CString::operator= には System::String のオーバーロードがあります。代入演算子は、参照をコピーする以外にも多くのことができることを忘れないでください。

このページ: 方法: さまざまな文字列型間の変換 は、混在するアプリに非常に役立ちます。pin_ptrは素晴らしいです。

マネージ コードをまき散らさないように注意してください。私はまた、/clr になった大規模な MFC アプリケーションにも取り組んでおり、選択したライブラリだけでそれを行っていたらよかったと思うことがあります。コールスタックにマネージ ネイティブ遷移が多数ある場合、デバッグが困難になる可能性があります。パフォーマンスに関する考慮事項もあります。

于 2008-11-20T02:31:54.757 に答える
1

system :: StringからCStringに移動できます。これは、共通の変換(lptstr?)を共有しているためです。CStringからSystem :: Stringに移動するには、常にSystem :: String ^ test = gcnew System :: String(CStringVar);が必要です。

于 2008-11-20T01:13:55.817 に答える