98

誰かが変換する簡単なコードを投稿してもらえますか?

System::String^

に、

C++std::string

つまり、次の値を割り当てたいだけです。

String^ originalString;

に、

std::string newString;
4

10 に答える 10

178

独自に作成しないでください。Microsoft が提供するこれらの便利な (そして拡張可能な) ラッパーを使用してください。

例えば:

#include <msclr\marshal_cppstd.h>

System::String^ managed = "test";
std::string unmanaged = msclr::interop::marshal_as<std::string>(managed);
于 2009-09-10T13:17:25.433 に答える
41

これは次のように簡単に行うことができます

#include <msclr/marshal_cppstd.h>

System::String^ xyz="Hi boys"; 

std::string converted_xyz=msclr::interop::marshal_as< std::string >( xyz);
于 2012-01-17T14:49:15.340 に答える
38

チェックアウトSystem::Runtime::InteropServices::Marshal::StringToCoTaskMemUni()とその友達。

申し訳ありませんが、現在コードを投稿できません。このマシンには、投稿する前にコンパイルを確認するための VS がありません。

于 2009-06-03T19:57:43.420 に答える
20

これは私のために働いた:

#include <stdlib.h>
#include <string.h>
#include <msclr\marshal_cppstd.h>
//..
using namespace msclr::interop;
//..
System::String^ clrString = (TextoDeBoton);
std::string stdString = marshal_as<std::string>(clrString); //String^ to std
//System::String^ myString = marshal_as<System::String^>(MyBasicStirng); //std to String^
prueba.CopyInfo(stdString); //MyMethod
//..
//Where: String^ = TextoDeBoton;
//and stdString is a "normal" string;
于 2010-12-12T13:54:50.920 に答える
9

これが私が何年も前にc++/ cliプロジェクトのために書いたいくつかの変換ルーチンです、それらはまだ動作するはずです。

void StringToStlWString ( System::String const^ s, std::wstring& os)
    {
        String^ string = const_cast<String^>(s);
        const wchar_t* chars = reinterpret_cast<const wchar_t*>((Marshal::StringToHGlobalUni(string)).ToPointer());
        os = chars;
        Marshal::FreeHGlobal(IntPtr((void*)chars));

    }
    System::String^ StlWStringToString (std::wstring const& os) {
        String^ str = gcnew String(os.c_str());
        //String^ str = gcnew String("");
        return str;
    }

    System::String^ WPtrToString(wchar_t const* pData, int length) {
        if (length == 0) {
            //use null termination
            length = wcslen(pData);
            if (length == 0) {
                System::String^ ret = "";
                return ret;
            }
        }

        System::IntPtr bfr = System::IntPtr(const_cast<wchar_t*>(pData));
        System::String^ ret = System::Runtime::InteropServices::Marshal::PtrToStringUni(bfr, length);
        return ret;
    }

    void Utf8ToStlWString(char const* pUtfString, std::wstring& stlString) {
        //wchar_t* pString;
        MAKE_WIDEPTR_FROMUTF8(pString, pUtfString);
        stlString = pString;
    }

    void Utf8ToStlWStringN(char const* pUtfString, std::wstring& stlString, ULONG length) {
        //wchar_t* pString;
        MAKE_WIDEPTR_FROMUTF8N(pString, pUtfString, length);
        stlString = pString;
    }
于 2009-06-03T23:51:06.383 に答える
6

String^ から std::string を取得する簡単な方法は、sprintf() を使用することです。

char cStr[50] = { 0 };
String^ clrString = "Hello";
if (clrString->Length < sizeof(cStr))
  sprintf(cStr, "%s", clrString);
std::string stlString(cStr);

マーシャル関数を呼び出す必要はありません!

更新エリックのおかげで、バッファ オーバーフローを防ぐために入力文字列のサイズをチェックするようにサンプル コードを修正しました。

于 2015-02-04T22:57:36.543 に答える
6

fstreamで使用してtxtファイルに出力できるように、WindowsフォームリストボックスのToString値を標準文字列に変換するのに何時間も費やしました。私のVisual Studioには、私が見つけたいくつかの回答が使用すると言ったマーシャルヘッダーファイルが付属していませんでした。多くの試行錯誤の後、私は最終的に System::Runtime::InteropServices を使用するだけで問題の解決策を見つけました:

void MarshalString ( String ^ s, string& os ) {
   using namespace Runtime::InteropServices;
   const char* chars = 
      (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
   os = chars;
   Marshal::FreeHGlobal(IntPtr((void*)chars));
}

//this is the code to use the function:
scheduleBox->SetSelected(0,true);
string a = "test";
String ^ c = gcnew String(scheduleBox->SelectedItem->ToString());
MarshalString(c, a);
filestream << a;

そして、ここに例を含むMSDNページがあります: http://msdn.microsoft.com/en-us/library/1b4az623(v=vs.80).aspx

私はそれが非常に単純な解決策であることを知っていますが、最終的に機能するものを見つけるために、トラブルシューティングといくつかのフォーラムへのアクセスに何時間もかかりました.

于 2011-10-27T18:18:19.417 に答える
0

私はマーシャラーから離れているのが好きです。

Using CString newString(originalString);

私にはずっときれいで速いようです。コンテキストの作成と削除について心配する必要はありません。

于 2016-07-08T16:07:28.813 に答える