La conversion entre les types gérés et non gérés en C ++?
-
09-09-2019 - |
Question
Quand j'utilise une interface graphique en C ++ les champs de texte sont stockés sous forme de chaînes gérées, je pense. Je besoin d'un moyen de les convertir en ints standard, flotteurs et cordes. Toute aide?
La solution
Vous pouvez convertir un System.String en un charbon non géré * en utilisant Marshal.StringToHGlobalAnsi . Assurez-vous libères lorsque vous avez terminé en appelant
Autres conseils
Pour utiliser la mémoire gérée dans le code natif, vous devez copier le contenu de la mémoire gérée dans la mémoire native d'abord.
Ainsi, par exemple:
Copie le 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 avons essayé de localiser les données que nous voulons convertir.
Par conséquent, 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.