10
votes

Qu'est-ce que c'est exactement un pwstr et pourquoi utiliser cette nommée par rapport à Char *, STD :: String ou CString en C ++?

Dans divers Code C ++, vous voyez souvent une utilisation différente des chaînes: pwstr, char *, std :: string, cschring, etc ...

Quel est le meilleur moment pour utiliser pwstr par rapport à tout autre type de chaîne?


0 commentaires

8 Réponses :


4
votes

Lorsque la bibliothèque utilisez-vous avec besoin d'un pwstr . Ceci est un, selon la convention de dénomination utilisée sous Windows, pointeur à une chaîne de caractères larges.

Par défaut, vous devez utiliser std :: chaîne / std :: wstring . Seulement lorsque vous interface avec quelqu'un qui attend quelque chose d'autre si vous modifiez cela.

Vous pouvez obtenir un pcwstr à partir d'un std :: wstring avec la méthode c_str () . cstring est MFC, si je me rappelle.


2 commentaires

@nobugz: J'ai dit const pour une raison: p


"Veut un pwstr" ... "Obtenez un PCWSTR de", pwstr! = pcwstr.



1
votes

c'est de l'API Windows.

Je me souviens de ça comme ça.

c'est un p -oint à un w -ide string.

Il serait utilisé dans une application Unicode. Son utilisation serait lorsque vous effectuez des appels vers Windows. Le meilleur type serait en réalité lttrstr p -oint à une chaîne t -yped (Unicode ou ANSI.


1 commentaires

LPTRSTR (Comme toutes ces chaînes t ne sont nécessaires que lorsque vous souhaitez que votre code soit compilé avec les deux paramètres UNICODE et ANSI. IME qui est rarement nécessaire. (Une fois que vous êtes allé unicode, pourquoi auriez-vous besoin de l'ANSI?)



1
votes

Le meilleur moment pour utiliser pwstr est si tout le code que vous modifiez / s'étendez déjà l'utilise. Il est généralement préférable de continuer à coder dans le paradigme de tout code que vous travaillez.

De même, si vous utilisez une forte utilisation d'une bibliothèque particulière qui déclare ses cordes d'une certaine manière, il est généralement préférable de garder ce type de chaîne dans votre propre code. Ainsi, fonctionnant avec Windows MFC, vous utiliseriez CSSTRing. Vieille-style Win32 serait généralement le LPCtstr et similaire.

C'est souvent une question de style plutôt qu'un détail de mise en œuvre particulier.


0 commentaires

2
votes

pwstr = pointeur sur une chaîne large = WCHAR * dans Windows

Le SDK Windows est très raccroché sur TypeDEFS pour les types et les pointeurs aux types.

"Quand à Rome" - Utilisez tout type de chaîne du projet que vous travaillez. Les types de chaîne ne sont pas suffisamment importants pour rechercher ou essayer de forcer votre une manière vraie sur tout ce qui est utilisé.


0 commentaires

1
votes

pwstr est un identifiant de quelque part dans . Il est préférable d'utiliser lorsque vous traitez avec la fonction Windows API nécessitant une telle chose et mieux évitée autrement.


0 commentaires

7
votes

Un pwstr serait un wchar_t pointeur de chaîne. C'est une chaîne unicode (généralement UCS2) avec chaque personnage prenant 16 bits.

A Char * serait un pointeur 8 bits par caractère. Cela pourrait être ASCII, ANSI, UTF8 ou l'une des centaines de centaines d'autres codages. Bien que vous n'avez besoin que de vous inquiéter des codages si vous avez besoin de la chaîne pour tenir des langues autres que les symboles anglais ou spéciaux.

En général, l'API Windows est tout unicode à l'intérieur de la place, la plupart des programmeurs Windows utilisent des chaînes WRCHAR. Mais std :: string et cstring peut être unicode si les bons symboles sont #definfin , donc votre choix entre pwstr , std :: string et csching sera une question de préférence ou de la convention de la base de code que vous travaillez.


8 commentaires

Sous Windows, WCHAR_T est toujours UTF-16.


Ce qui doit être défini pour changer std :: chaîne dans un conteneur de wchar_t ? Est-ce même légal sur le respect de la norme - je pense que std :: string est requis pour être std :: basique_string .


@ D.Shawley: Ce serait std: wstring si vous voulez être pédant à ce sujet.


@Nemanja: pwstr est un #define, il n'est pas limité à Windows, il est utilisé par quiconque croit aux informations de type de codage dans les noms de type.


@John: Pwstr parle strictement un typedef et une partie de Windows SDK. Je ne l'ai pas vu ailleurs.


@Nemanja. Tort. Sur Windows Wchar_T est toujours de 16 bits. Cela ne garantit pas UTF16. Vous pouvez très heureusement utiliser un wchar_t * pour tenir utf32 où 2 wchar_t sont chaque symbole. Peut-être que vous vouliez dire que dans les fenêtres API WCHAR_T est toujours UTF16?


@kts: C'est exactement ce que je veux dire - aussi loin que Windows Api, Wchar_T * est uniquement UTF-16. Pour vos propres fins, bien sûr, vous pouvez mettre tout ce que vous voulez dans WCHAR_T.


Erreur C2440: 'Retour': impossible de convertir de 'const wchar_t *' 'à' const pwstr '



0
votes

Jetez un coup d'œil au fichier Winnt.h dans Windows SDK - vous verrez que PWSTR est un typbef pour WCHAR *. Ce n'est pas une macro.


0 commentaires

0
votes

venir dans cette fin tard; Il y a une raison un peu meilleure d'utiliser pwstr et des types associés qu'il y a une décennie: Microsoft's Langue d'annotation de code source . Ce sont des marqueurs utilisés dans le code pour donner aux astuces de compilateur like-like de l'intention du code, qui est comme GNU __ attribut __ ou C ++ [[Attribut]] sur mega stéroïdes.

avec Sal, vous pouvez annoter votre code et vos données avec des jetons qui indiquent des intentions de niveau supérieur: il s'agit d'un paramètre d'entrée, c'est-à-dire que cela ne peut pas être null, vous devez vérifier la valeur de retour de cette fonction, etc.

C'est une liste très, très longue, en expansigeant sur les plus âgés et plus simples dans , out et inout Marqueurs de paramètre.

Dans les anciens jours, les fichiers d'en-tête Windows inclus: xxx

conceptuellement, je comprends ce qu'ils essayaient d'accomplir, montrant l'intention de Comment cela doit être utilisé, mais si Verbose je ne les ai jamais utilisé.

mais maintenant, c'est: xxx

ici, le _null_terminé < / Code> L'attribut est effectué avec le type et est utilisé par leur infrastructure d'analyse de code pour les erreurs de fabrication de matières. Utilisation de types distincts - pointant vers un seul caractère par rapport à une chaîne - l'aide vraiment à percer au comportement intentionnel.

Les en-têtes sont pleins de ces annotations: un exemple de : xxx

à la fois des paramètres, bien que techniquement pointus sur un seul caractère, dites au compilateur que nous sommes dans un territoire à cordes après tout.

Je n'utilise toujours pas les types pwstr -Forné, mais si vous les utilisez, vous obtenez une source de recherche gratuitement. Sal a trouvé assez de bugs dans mon code juste ce matin.


0 commentaires