Comment convertir System::String * Char * dans Visual C++

Cet article fait référence aux espaces de noms bibliothèque de classes Microsoft.NET Framework suivant :
  • System::Runtime::InteropServices
  • Msclr::interop

Résumé

Cet article décrit plusieurs méthodes pour convertir System::String * char * en utilisant les éléments suivants :
  • Les extensions managées pour C++ dans Microsoft Visual C++ .NET 2002 et Visual C++ .NET 2003
  • C + c++ / CLI dans Microsoft Visual C++ 2005 et Microsoft Visual C++ 2008

Méthode 1

PtrToStringChars vous donne un pointeur intérieur à l’objet réel de la chaîne. Si vous passez ce pointeur à un appel de fonction non managée, vous devez tout d’abord épingler le pointeur afin de s’assurer que l’objet ne se déplace pas au cours d’un processus de nettoyage 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 chaîne managé dans un tas natif et il convertit ensuite au format American National Standards Institute (ANSI) à la volée. Cette méthode alloue la mémoire nécessaire tas natif :
//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 Visual C++ 2008, vous devez ajouter l’option de compilateur common language runtime prise en charge (/ CLR : oldSyntax) pour la compilation correcte de l’exemple de code précédent. Pour ajouter l’option de compilateur common language runtime prise en charge, procédez comme suit :

  1. Cliquez sur projet, puis cliquez sur propriétés NomProjet .



    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 le Common Language Runtime prend en charge les paramètres de projet.
  4. Cliquez sur Appliquer, puis cliquez sur OK.
Pour plus d’informations sur les options du compilateur de common language runtime prise en charge, visitez le site Web de Microsoft Developer Network (MSDN) à l’adresse suivante :

Ces étapes s’appliquent à l’article complet.

Méthode 3

La classe VC7 CString possède un constructeur qui prend un pointeur de chaîne managé et charge 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 aide de marshal marshal_as < T > et la classe d’assistance de 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 n’est pas compilé à l’aide des extensions managées pour C++ dans Visual C++ .NET 2002 ou Visual C++ .NET 2003. Il utilise le nouveau C + / syntaxe CLI qui a été introduite dans Visual C++ 2005 et le nouveau code d’espace de noms msclr qui a été introduit dans Visual C++ 2008. Pour compiler correctement ce code, vous devez utiliser le commutateur de compilation /clr C++ dans Microsoft Visual C++ 2008.

Extensions managées pour C++ de l’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;
}

C + / code d’exemple 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;
}

Références

Pour les autres articles de la Base de connaissances Microsoft Visual C++ .NET consultés, visitez le site Web de Microsoft à l’adresse suivante :
Propriétés

ID d'article : 311259 - Dernière mise à jour : 27 janv. 2017 - Révision : 1

Microsoft Visual C++ 2008 Express Edition, Microsoft Visual C++ 2005 Express Edition, Microsoft Visual C++ .NET 2003 Initiation, Microsoft Visual C++ .NET 2002 Initiation

Commentaires