Partager via


Convertir de System ::String en char dans Visual C++

Cet article décrit plusieurs façons de procéder à la conversion à l’aide System::String* char* d’extensions managées dans Visual C++.

Version du produit d’origine : Visual C++
Numéro de 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 façons de procéder à la conversion à l’aide System::String* char* 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 en format ANSI (American National Standards Institute) à la volée. Cette méthode alloue la mémoire du 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);

Note

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 Project, puis sur Propriétés ProjectName.

    Note

    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 la prise en charge du Common Language Runtime, ancienne syntaxe (/clr :oldSyntax) dans les paramètres du projet de prise en charge du Common Language Runtime.

  4. Cliquez sur Appliquer, puis sur OK.

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

/clr (Compilation pour le Common Language Runtime)

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

Méthode 3

La classe VC7 CString a un constructeur qui prend un pointeur string managé et charge le CString contenu 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 marshal_as<T> classe d’aide marshal et la marshal_context() classe d’assistance marshal.

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

Note

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 ce code, vous devez utiliser le commutateur du compilateur /clr C++ 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;
}