FAQ C++/CLI et VC++.Net

FAQ C++/CLI et VC++.NetConsultez toutes les FAQ
Nombre d'auteurs : 29, nombre de questions : 248, création le 22 février 2013
Sommaire→Mixer du C++/CLI avec du code Win32 ou MFC→Conversions- Comment convertir une String ^ en char * ?
- Comment convertir une String ^ en wchar_t * ?
- Comment convertir un char * en String ^ ?
- Comment convertir un string de la STL en String ^ ?
- Comment convertir une String ^ en string de la STL ?
- Comment convertir un objet d'un type de base en un objet d'un autre type de base ?
Il est parfois utile de pouvoir convertir une String .Net en char *, notamment lorsqu'on veut utiliser des API Win32.
Après cette conversion, on pourra par exemple utiliser chaineChar avec SetWindowText.
String ^chaineManagee = "Chaine Managée";
char* chaineChar = static_cast<char *>(System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(chaineManagee).ToPointer());
// utilisation de la chaîne
System::Runtime::InteropServices::Marshal::FreeHGlobal(safe_cast<IntPtr>(chaineChar));Remarque, la chaîne devra être utilisée avant sa libération avec FreeHGlobal.
On peut procéder aussi d'une autre façon :
#include <vcclr.h>
String ^chaineManagee = gcnew String("une chaine Managée");
char * chaineChar;
pin_ptr<const wchar_t> wch = PtrToStringChars(chaineManagee);
int taille = (chaineManagee->Length+1) * 2;
chaineChar = new char[taille];
int t = WideCharToMultiByte(CP_ACP, 0, wch, taille, NULL, 0, NULL, NULL);
WideCharToMultiByte(CP_ACP, 0, wch, taille, chaineChar, t, NULL, NULL);Cette solution a l'inconvénient d'appeler une méthode de l'API Win32 pour la conversion.
Ne pas oublier de libérer chaineChar après utilisation (avec delete).
Il est parfois utile de pouvoir convertir une String .Net en wchar_t *, notamment lorsqu'on veut utiliser des API Win32 en Unicode.
Après cette conversion, on pourra par exemple utiliser wchar avec SetWindowText.
String ^chaineManagee = "Chaine Managée";
IntPtr p = System::Runtime::InteropServices::Marshal::StringToHGlobalUni(chaineManagee);
LPCWSTR wchar = static_cast<LPCWSTR>(static_cast<void *>(p));
System::Runtime::InteropServices::Marshal::FreeHGlobal(p);On peut procéder aussi d'une autre façon :
// Helper pour extensions managées
#include <vcclr.h>
// pin_ptr indique que le Garbage collector ne pourra pas déplacer la zone mémoire correspondante
pin_ptr<const wchar_t> strValueDLLPath = PtrToStringChars(sValuesDLLPath);Pour convertir une chaine de type char * en String ^, rien de plus simple :
char chaine[255] = "Une chaine";
String ^ str = gcnew String(chaine);On utilise la surcharge du constructeur pour un type const char * :
String ^ s = gcnew String(chaineSTL.c_str());Le principe est de convertir d'abord en char *, puis de convertir en string :
String ^chaineManagee = gcnew String("une chaine Managée");
char * chaineChar;
pin_ptr<const wchar_t> wch = PtrToStringChars(chaineManagee);
int taille = (chaineManagee->Length+1) * 2;
chaineChar = new char[taille];
int t = WideCharToMultiByte(CP_ACP, 0, wch, taille, NULL, 0, NULL, NULL);
WideCharToMultiByte(CP_ACP, 0, wch, taille, chaineChar, t, NULL, NULL);
std::string chaineSTL = chaineChar;La classe System::Convert permet de convertir des objets de types de base.
Il existe d'autres méthodes pour le faire, mais l'avantage de la classe System::Convert est qu'elle est indépendante du langage utilisé.
System::Convert dispose d'une multitude de méthodes pour effectuer toutes sortes de conversions possibles entre les types de bases.
Voici quelques exemples :
// Conversion d'un entier vers une chaînes de caractères
int i = 10;
String ^s = Convert::ToString(i);
// Conversion d'une chaine vers un entier
i = Convert::ToInt32(s);
// Notez que si la conversion ne peut se faire, une exception est levée.
// Ce serait le cas si s = "NonNumérique"Il est aussi possible d'utiliser la méthode Parse de chaque type de base.
String ^s = "35000";
int i = int::Parse(s);


