7
votes

Convertir une chaîne ^ à wstring c ++

J'ai programmé une petite application en C ++. Il y a une liste de liste dans l'interface utilisateur. Et je souhaite utiliser l'élément sélectionné de la liste de liste pour un algorithme où je peux utiliser uniquement des wstrings.

Dans l'ensemble, j'ai deux questions: -Comment puis-je convertir mon xxx

à un test wstring?

-Qu'est-ce que signifie le ^ dans le code?

Merci beaucoup!


5 commentaires

Ceci est un double de cette question: Stackoverflow.com/Questtions/13665649/... En outre, le ^ est une poignée C ++ / CLI, similaire au * concept de la norme C ++. C'est ce qu'on appelle une poignée et signifie que l'objet est un objet .NET.


Est-ce géré C ++ A.K.A. C ++ / CLI?


@ Mauricerevaves Je ne pense pas que ce soit un duplicata de cette cause, il ne s'agit pas de convertir à un wstring! Merci pour les informations sur ^


@ulidtko ouais c'est une application C ++ / CLI


Dupliqué possible de besoin de convertir une chaîne ^ en char *


5 Réponses :


0
votes

J'ai marqué cela comme un duplicata, mais voici la réponse sur la manière d'obtenir de System.string ^ code> à un std :: string code>.

String^ test = L"I am a .Net string of type System::String";
IntPtr ptrToNativeString = Marshal::StringToHGlobalAnsi(test);
char* nativeString = static_cast<char*>(ptrToNativeString.ToPointer());


9 commentaires

Yuck. Je refuse de réinventer cette roue particulière, d'autant plus que la réinvention utilise des fonctions non nommées à tort. Il n'y a pas de hglobal ici du tout. L'utilisation de ce code est un cauchemar de documentation, car vous devez écrire des commentaires expliquant ce que les pointeurs non anglobaux sont réellement.


En fait, votre réponse est bien meilleure. Je dois regarder la méthode Marshal_as. +1. Merci d'avoir pointé le chemin.


Je veux vraiment de l'aide de l'aide (bien, de la baisse) chaque réponse qui suggère stringtohglobalansi pour cela. Mais c'est un travail pour un autre jour.


Ce sera difficile, car il s'agit de la réponse que même Microsoft recommande ce type de problème: msdn.microsoft.com/en-us/library/...


C'est la page stringtohglobalansi , ils doivent utiliser cette fonction. En aucun cas, un exemple quelque part indique que c'est le meilleur moyen d'effectuer la tâche.


Au fait, cela ne vous réserve pas une large chaîne.


À droite. Mais si vous faites une recherche, c'est l'une des pages plus référencées. Par exemple: support.microsoft.com/kb/311259 que je comprends si votre point. :-RÉ


Oui, qui mentionne également marshal_as . Ils pourraient faire un bon travail d'insistance que l'on vaut mieux, cependant.


Je suis d'accord. Ils font mention de la mention lorsque chaque méthode est mentionnée, mais n'indique pas ce qui est le meilleur, préféré, etc.



19
votes

Il devrait être aussi simple que:

#include <vcclr.h>
pin_ptr<WCHAR> content = PtrToStringChars(curItem);
std::wstring result(content, curItem->Length);


13 commentaires

Merci Ben Voigt - Je vais le tester - donnez-moi 5 minutes :-)


Ben peux-tu me dire d'où je reçois Marshal_as? Aussi j'ai l'inclusion du fichier d'en-tête


@ user1557170: Oups, vous avez besoin d'un deuxième fichier d'en-tête. Désolé pour ça.


Je suis maintenant un peu confus - pouvez-vous simplement me dire quel code j'ai besoin? Je ne suis pas un programmeur professionnel comme toi


Juste la première ligne, plus les deux fichiers d'en-tête. Tout au-dessous du diviseur explique simplement ce que marshal_as fait réellement à l'intérieur.


Devrais-je avoir besoin d'un fichier d'en-tête spécial?


Mon compilateur me dit que Marshal_as n'est pas défini


@ user1557170: il y a aussi un espace de noms. Désolé de quitter ça. Vous pouvez également dire à l'aide de NAMESPACE MSCLR :: Interop;


ouais maintenant ça marche mec :-) Merci pour le grand soutien tu étais une grande aide


Pouvez-vous me dire quelle est la meilleure façon d'obtenir un programmeur professionnel comme vous?


@ user1557170: pratique. Suivez les tutoriels écrits par des experts. Résoudre de petits problèmes. Lire le code des autres peuples qui résout de gros problèmes. Apprenez-en de cela. Écrire plus de code. En savoir plus de code. Demandez ce qui rend le code bon ou mauvais et pourquoi.


Puis-je demander, MSCLR :: Interop :: Marshal_as nécessite un nettoyage?


@Robinson: Il existe deux groupes de conversions, ceux qui nécessitent un nettoyage nécessitent de créer un Marshal_Context instance qui effectue le nettoyage lorsqu'il est hors de portée. Ceux qui ne nécessitent pas de nettoyage (car ils renvoient un objet intelligent comme std :: string qui sait se nettoyer) utilisez marshal_as . Vous ne pouvez pas vous tromper si vous ne faites pas quelque chose de fou comme une fuite intentionnellement un marshal_context objet.



0
votes

Ma version est la suivante:

Platform::String^ str = L"my text";

std::wstring wstring = str->Data();


3 commentaires

I Obtenir une erreur Erreur C2039: "Données": n'est pas membre de "System :: String '


Ce travail sur WinRT avec C ++ / CX pas sur l'ancien CLR avec C ++ / CLI .


J'aime ça, car c'est tout droit: string ^ est dans utf16, et si std :: wstring devrait également rester dans utf16 - il n'y a pas de conversion nécessaire simplement copie des caractères. Voté.



0
votes

avec Visual Studio 2015, faites-le simplement: xxx pré>

C ++ / cli strong> p> xxx pré>

C ++ / CX FORT> P>

const wchart_t* ptr = s->Data();


0 commentaires

0
votes

Selon Microsoft:

ref Comment: Convertir System :: String to standard String

Vous pouvez convertir une chaîne en STD: STD ou STD :: wstring, sans utiliser de ptrtostringchars dans Vcclr.h. xxx

sortie: xxx


0 commentaires