Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 :
Cliquez sur Project, puis sur Propriétés ProjectName.
Note
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 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.
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;
}