IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

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 

 
OuvrirSommaireMixer du C++/CLI avec du code Win32 ou MFCConversions

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.

 
Sélectionnez
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 :

 
Sélectionnez
#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).

Mis à jour le 12 juillet 2006  par nico-pyright(c), StormimOn

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.

 
Sélectionnez
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 :

 
Sélectionnez
// 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);
Créé le 9 mai 2006  par nico-pyright(c), abelman

Pour convertir une chaine de type char * en String ^, rien de plus simple :

 
Sélectionnez
char chaine[255] = "Une chaine";
String ^ str = gcnew String(chaine);
Créé le 9 mai 2006  par nico-pyright(c)

On utilise la surcharge du constructeur pour un type const char * :

 
Sélectionnez
String ^ s = gcnew String(chaineSTL.c_str());
Créé le 12 juillet 2006  par nico-pyright(c)

Le principe est de convertir d'abord en char *, puis de convertir en string :

 
Sélectionnez
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;
Créé le 12 juillet 2006  par nico-pyright(c)

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 :

 
Sélectionnez
// 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.

 
Sélectionnez
String ^s = "35000";
int i = int::Parse(s);
Créé le 9 mai 2006  par nico-pyright(c), abelman

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006-2007 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.