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
- 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);