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 :
Cliquez sur Projet, puis sur Propriétés du nom du projet.
Remarque
ProjectName est un espace réservé pour le nom du projet.
Développez Propriétés de configuration, puis cliquez sur Général.
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 .
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;
}
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour