102 votes

C++/CLI Conversion de System::String^ en std::string

Quelqu'un peut-il afficher un code simple qui permettrait de convertir,

System::String^

A,

C++ std::string

C'est-à-dire que je veux juste assigner la valeur de ,

String^ originalString;

A,

std::string newString;

186voto

tragomaskhalos Points 1085

N'en faites pas trop, utilisez ces des wrappers pratiques (et extensibles) fournis par Microsoft.

Par exemple :

#include <msclr\marshal_cppstd.h>

System::String^ managed = "test";
std::string unmanaged = msclr::interop::marshal_as<std::string>(managed);

2 votes

Thx pour ce lien utile, cette astuce m'a épargné beaucoup de codage. comme une note latérale : les modèles/classes sont dans #include <msclr\*.h> (par exemple, #include <msclr \marshal.h >) et dans l'espace de noms msclr::interop, voir un exemple à msdn.microsoft.com/de-de/library/vstudio/bb384859(v=vs.90).aspx )

4 votes

Bien que cela soit pratique, il manque totalement un support d'encodage approprié. Voir aussi ma question sur le SO : stackoverflow.com/questions/18894551/ . Mon hypothèse est que marshal_as convertit les chaînes Unicode en ACP dans std::string.

0 votes

La recommandation de MS est d'utiliser marshal_context et de le supprimer une fois la conversion effectuée. Le lien : msdn.microsoft.com/fr/us/library/bb384856.aspx

42voto

Vous pouvez facilement procéder comme suit

#include <msclr/marshal_cppstd.h>

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

std::string converted_xyz=msclr::interop::marshal_as< std::string >( xyz);

0 votes

+1 pour une solution courte et simple et un exemple de fonctionnement simple (bien qu'il y ait une parenthèse supplémentaire à la fin de votre code)

0 votes

C'est la seule solution qui répond directement à la question.

12 votes

Hmm... 33 upvotes pour une réponse qui a déjà été donnée plus de 2 ans auparavant avec presque les mêmes lignes de code. respect pour avoir gagné autant de points pour cela ;-)

38voto

Martin Points 3552

Vérifiez System::Runtime::InteropServices::Marshal::StringToCoTaskMemUni() et ses amis.

Désolé, je ne peux pas poster le code maintenant ; je n'ai pas VS sur cette machine pour vérifier qu'il compile avant de le poster.

20voto

Alejandro Perea Points 191

Cela a marché pour moi :

#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;

3 votes

Traduction anglaise : "Je vais répondre à ce post également :p. C'est ma fonction."

9voto

Ben Schwehn Points 3162

Voici quelques routines de conversion que j'ai écrites il y a plusieurs années pour un projet c++/cli, elles devrait fonctionnent toujours.

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;
    }

0 votes

@alap, Utiliser System::Runtime::InteropServices::Marshal ou écrire en utilisant l'espace de noms System::Runtime::InteropServices ; .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X