Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

String^ en string


Sujet :

C++/CLI

  1. #1
    Membre du Club
    String^ en string
    Bonjour à vous,

    Je suis en train de concevoir une application sous Windows Forms, et je vois que le nom du fichier que je sélectionne est pris en String^, il me faudrait l'avoir plutôt en string pour pouvoir l'utiliser dans une autre partie de mon programme, pouvez vous m'aider à le "convertir" svp?

    Je vous remercie d'avance !

  2. #2
    Membre du Club
    J'ai trouvé, il faut utiliser marshal_cppstd.h

  3. #3
    Membre habitué
    Si ça peut te servir :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    // Fonction permettant de transformer une chaîne de System::String en std::string
    std::string ToStdString(String ^_strString)
    {
        IntPtr pString =  System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(_strString);
        std::string stdString((const char*) pString.ToPointer());
        System::Runtime::InteropServices::Marshal::FreeHGlobal(pString);
        return stdString;
    }
     
    std::string ToStdStringEOM(String ^_strString)
    {
        pin_ptr<const wchar_t> strWideString = PtrToStringChars(_strString);
        int iSizeString = (_strString->Length+1) * 2;
        char * pszBuffer = new char[iSizeString];
        int t = WideCharToMultiByte(CP_OEMCP, 0, strWideString, iSizeString, NULL, 0, NULL, NULL); 
        WideCharToMultiByte(CP_OEMCP, 0, strWideString, iSizeString, pszBuffer, t, NULL, NULL);
     
        std::string strRet(pszBuffer);
        delete []pszBuffer;
     
        return strRet;
    }

  4. #4
    Expert éminent sénior
    Citation Envoyé par Feneck91 Voir le message
    Si ça peut te servir :
    <snip>
    Ce code est obsolète depuis que .Net 4.0 offre marshal_as (de marshal_cppstd.h), il n'est pas exception-safe, et n'utilise pas correctement le double-appel à WideCharToMultiByte() (qui aurait de toute façon pu être évité en utilisant un System::Text::Encoding).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.