7
votes

VC ++ - Comment convertir une CSTRAINE EN LPCWSTR

J'ai essayé de le faire, mais je n'ai trouvé aucune méthode pour cela. Je demande cela en raison du fait que je suis nouveau à Windows. J'ai essayé des STL-Strings, mais Visual Studio 2008 a accumulé des bugs dans la manipulation de STL-WSTRING. Je dirai beaucoup de choses sur cette chose plus tard, dans une autre question. Maintenant, quelqu'un peut-il faire la lumière sur ce problème?


0 commentaires

6 Réponses :


5
votes

Cela devrait le faire, en supposant que votre application ne soit pas déjà définie sur Unicode (si elle est, juste jetée directement): xxx


1 commentaires

Tant de réponses compliquées (et de mauvaises erronées) et le seul moyen correct de le faire en MFC (par la conversion C'Tors) n'a pas eu de upvotes?



1
votes

Si vous avez Unicode, _unicode drapeaux compilateur définis alors une simple affectation devrait fonctionner. Si vous avez _mbcs défini, vous devez utiliser Méthode MultiByteTowidechar .


2 commentaires

Trop complexe en MFC. Mieux utiliser cstringw comme suggéré ou une classe CX2Y appropriée.


cstring a la conversion C'Tors. Si vous avez besoin d'une chaîne de caractères larges à partir d'une chaîne codée ANSI, faites simplement CStringw WInString (NarrowString); , où Narrowstring est de type cstringa .



0
votes

Vous pouvez également utiliser la macro T2W () pour éviter d'écrire plusieurs lignes de code multibytetowidechar.


1 commentaires

Mieux vaut utiliser les classes CX2Y au lieu des anciennes macros T.



6
votes

Utilisez la classe de conversion CT2CW comme ceci FunckakakingLPCWSTR (CT2CW (cstring_var)) . Ceci est garanti de travailler dans des constructions Unicode ou MBCS.

Aussi, gardez à l'esprit que la chaîne passée à la fonction peut être temporaire, alors ne le stockez pas pour une utilisation ultérieure.


0 commentaires

8
votes

Le moyen le plus simple consiste à utiliser les macros de conversion de chaîne MFC, définie à:

https://docs.microsoft.com/en-us/cpp/atl/reference/string-conversion-macros?view=MSVC-160

Par exemple, la macro à convertir cstring à lpcwstr est CT2W (s) .

Une autre solution consiste à utiliser le CStringa spécialisé et cstringw classes. Ce sont les versions ascii et larges correspondantes de cstring en fonction de si vous compilez avec le drapeau Unicode . Vous pouvez donc utiliser: xxx

pour obtenir une version large de votre chaîne.


0 commentaires

2
votes
LPCWSTR pstr;
CString cstrTemp;

...

pstr = cstrTemp.AllocSysString();
AllocSysString will return a BSTR type string, that can be converted to LPCWSTR directly. 

1 commentaires

Un BSTR ne peut pas être converti en un lpcwstr . Les deux types de chaîne ont une sémantique différente. Par exemple, nullptr est toujours un btr . lpcwstr ne fait aucune garantie. En outre, un BSTR doit être nettoyé appelant sysfreestring . Votre code ne montre pas cela, et votre explication ne le remarque pas non plus. Étant donné que l'OP demande un pointeur Const , il est probable qu'ils n'ont même pas besoin d'une copie. Dans ce cas, l'opérateur intégré LPCTSTR () peut déjà être suffisant. Et vraiment, sauf si vous avez besoin d'un BSTR , n'en utilisez pas simplement un parce que vous ne savez pas quoi faire d'autre. Désolé, -1.