Lorsque j'utilise une interface graphique en C++, les champs de texte sont stockés en tant que chaînes gérées, je pense. J'ai besoin d'un moyen de les convertir en ints, floats et cordes standards. De l'aide?Conversion entre les types gérés et non gérés en C++?
Répondre
Vous pouvez convertir un System.String en un caractère non géré * à l'aide de Marshal.StringToHGlobalAnsi. Assurez-vous de le libérer lorsque vous avez terminé en appelant le Marshal.FreeHGlobal. Pour convertir les chaînes en valeurs numériques, vous pouvez utiliser les fonctions d'analyse régulières .NET telles que Int32.Parse
.
Pour utiliser la mémoire gérée en code natif, vous devez d'abord copier le contenu de la mémoire gérée dans la mémoire native.
Ainsi, par exemple:
Copie du contenu de la mémoire gérée est la suivante:
const int len = 50;
BYTE *destination = new BYTE[nLength];
System::Byte source[] = new System::Byte[len];
System::Runtime::InteropServices::Marshal::
Copy(source, 0, IntPtr((void *)destination, len);
Parce que nous avons affaire à la mémoire gérée, la collecte des ordures peut se déplacer et déplacer les données gérées à un autre endroit et tout serait perdu si nous essayions de localiser les données que nous voulons convertir.
donc nous voulons "épingler en mémoire" à l'aide __pin convertir réussi à non géré:
const int len = 50;
BYTE *source = new BYTE[len];
System::Byte destination[] = new System::Byte[len];
BYTE __pin *managedData = &(destination[0]);
::memcpy(source, managedData, len);
Vous pouvez simplement convertir System :: String^objets MFC CString par
CString* name = new CString(managedName);
où managedName est une chaîne gérée.