Convertir à partir de System ::String en Char dans Visual C++

Cet article décrit plusieurs méthodes de conversion de à à char* à l’aide d’extensions System::String* managées dans Visual C++.

Version d’origine du produit : Visual C++
Numéro de la base de connaissances d’origine : 311259

Résumé

Cet article fait référence aux espaces de noms de bibliothèque de classes Microsoft .NET Framework suivants :

  • System::Runtime::InteropServices
  • Msclr::interop

Cet article décrit plusieurs méthodes de conversion de System::String* à char* l’aide des éléments suivants :

  • Extensions managées pour C++ dans Visual C++ .NET 2002 et Visual C++ .NET 2003
  • C++/CLI dans Visual C++ 2005 et visual C++ 2008

Méthode 1

PtrToStringChars vous donne un pointeur intérieur vers l’objet réel String . Si vous passez ce pointeur à un appel de fonction non managé, vous devez d’abord épingler le pointeur pour vous assurer que l’objet ne se déplace pas pendant un processus de garbage collection asynchrone :

//#include <vcclr.h>
System::String * str = S"Hello world\n";
const __wchar_t __pin * str1 = PtrToStringChars(str);
wprintf(str1);

Méthode 2

StringToHGlobalAnsi copie le contenu d’un objet managé String en tas natif, puis le convertit au format ANSI (American National Standards Institute) à la volée. Cette méthode alloue la mémoire de tas native requise :

//using namespace System::Runtime::InteropServices;
System::String * str = S"Hello world\n";
char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
printf(str2);
Marshal::FreeHGlobal(str2);

Remarque

Dans Visual C++ 2005 et dans Visual C++ 2008, vous devez ajouter l’option de compilateur de prise en charge du Common Language Runtime (/clr :oldSyntax) pour compiler correctement l’exemple de code précédent. Pour ajouter l’option de compilateur de prise en charge du Common Language Runtime, procédez comme suit :

  1. Cliquez sur Projet, puis sur Propriétés du nom du projet.

    Remarque

    ProjectName est un espace réservé pour le nom du projet.

  2. Développez Propriétés de configuration, puis cliquez sur Général.

  3. Dans le volet droit, cliquez pour sélectionner Prise en charge du Common Language Runtime, Ancienne syntaxe (/clr :oldSyntax) dans les paramètres de projet de prise en charge du Common Language Runtime .

  4. Dans la zone Plan de numérotation (contexte téléphonique), cliquez sur Parcourir pour localiser le plan de numérotation de l’utilisateur.

Pour plus d’informations sur les options de compilateur de prise en charge du Common Language Runtime, visitez le site Web MSDN (Microsoft Developer Network) suivant :

/clr (Compilation du Common Language Runtime)

Ces étapes s’appliquent à l’ensemble de l’article.

Méthode 3

La classe VC7 CString a un constructeur qui accepte un pointeur string managé et charge le CString avec son contenu :

//#include <atlstr.h>
System::String * str = S"Hello world\n";
CString str3(str);
printf(str3);

Méthode 4

Visual C++ 2008 introduit la classe d’aide marshal marshal_as<T> et la classe d’assistance marshal marshal_context() .

//#include <msclr/marshal.h>
//using namespace msclr::interop;
marshal_context ^ context = gcnew marshal_context();
const char* str4 = context->marshal_as<const char*>(str);
puts(str4);
delete context;

Remarque

Ce code ne se compile pas à l’aide d’extensions managées pour C++ dans Visual C++ .NET 2002 ou dans Visual C++ .NET 2003. Il utilise la nouvelle syntaxe C++/CLI introduite dans Visual C++ 2005 et le nouveau code d’espace de noms msclr introduit dans Visaul C++ 2008. Pour compiler correctement ce code, vous devez utiliser le commutateur du compilateur C++ /clr dans Visual C++ 2008.

Extensions managées pour C++ exemple de code (Visual C++ 2002 ou Visual C++ 2003)

//compiler option: cl /clr
#include <vcclr.h>
#include <atlstr.h>
#include <stdio.h>
#using <mscorlib.dll>
using namespace System;
using namespace System::Runtime::InteropServices;

int _tmain(void)
{
    System::String * str = S"Hello world\n";

    //method 1
    const __wchar_t __pin * str1 = PtrToStringChars(str);
    wprintf(str1);

    //method 2
    char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);
    printf(str2);
    Marshal::FreeHGlobal(str2);

    //method 3
    CString str3(str);
    wprintf(str3);

    return 0;
}

Exemple de code C++/CLI (Visual C++ 2005 et Visual C++ 2008)

//compiler option: cl /clr

#include <atlstr.h>
#include <stdio.h>
#using <mscorlib.dll>

using namespace System;
using namespace System::Runtime::InteropServices;

#if _MSC_VER > 1499 // Visual C++ 2008 only
#include <msclr/marshal.h>
using namespace msclr::interop;
#endif

int _tmain(void)
{
    System::String ^ str = "Hello world\n";

    //method 1
    pin_ptr<const wchar_t> str1 = PtrToStringChars(str);
    wprintf(str1);

    //method 2
    char* str2 = (char*)Marshal::StringToHGlobalAnsi(str).ToPointer();
    printf(str2);
    Marshal::FreeHGlobal((IntPtr)str2);

    //method 3
    CString str3(str);
    wprintf(str3);

    //method 4
    #if _MSC_VER > 1499 // Visual C++ 2008 only
    marshal_context ^ context = gcnew marshal_context();
    const char* str4 = context->marshal_as<const char*>(str);
    puts(str4);
    delete context;
    #endif

    return 0;
}