IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Comment initialiser une chaîne Unicode et y accéder avec son pointeur (LPWCSTR)


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2012
    Messages : 17
    Par défaut Comment initialiser une chaîne Unicode et y accéder avec son pointeur (LPWCSTR)
    Bonjour

    Ma question est une question de débutant à laquelle je n'ai pas trouvé de réponse évidente (même dans les FAQ)
    Petite précision j’utilise Visual C++ 6.0.

    Donc, j'ai besoin d'utiliser la fonction suivante qui renvoie un long :
    CeRegOpenKeyEx (HKEY, LPCWSTR, DWORD, REGSAM, PHKEY)

    Mon 2eme argument est un pointeur sur une chaîne constante en UNICODE. Dans mon cas cette chaîne contient le mot "Ident"

    Question, comment définir ma chaîne et son pointeur ? Y'a-t-il une façon simple et rapide (avec une macro). A priori je dirais qu'oui tellement cette opération est banale.

    Merci à tous de vos réponses.

    LS

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Attention, c'est un pointeur sur chaine ou une chaine?

    Il y a quatre cas: un char**, un const char **, un char* ou un const char *?

    • const char*, donne directement "Ident", c'est un littéral de type const char*
    • char*: il faut donner de la mémoire modifiable, je ne pense pas que ce soit demandé par la fonction. (déclarer char p[100], donner p)
    • char**: déclare un char *p, et donne &p a la fonction.
    • const char**: meme chose, mais en constant.



    Nul besoin de macro ici. Rappelle-toi qu'une macro est remplacé par le code correspondant dans le code. Il n'y a aucune magie créant de la performance.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2012
    Messages : 17
    Par défaut
    Bonjour l'Eternel

    Effectivement je suis bien d'accord la performance n'a rien de magique elle n'est que le fruit de la pratique...

    Dans mon cas la fonction attend un pointeur long (LP) sur une chaîne (STR) de longueur constante (C) dont chaque caractère tient sur 2 octets (W) puisque c'est de l'UNICODE.
    D’après mes connaissances en C++, il suffirait de déclarer un chaîne constante (const char []="Ident") de l'initialiser, de créer un pointeur sur cette chaîne et de l'initialiser avec l'opérateur &
    Le problème c'est que le type char n'est que sur un octet.

    Je vais essayer ce que tu me proposes donc a priori const char**. Au fait pourquoi const char**, et pas const char* ? Un pointeur sur un pointeur ? Je ne comprend pas bien cette syntaxe.

    En tous cas merci de ta précieuse aide.

    Bon dimanche.

    LS

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Tu as en C++ des wchar qui, je crois, se déclarent avec L"blabla".

    Cependant, tu es dans l'API de windows, que je ne connais pas.
    Tu as certainement un typedef à utiliser dans ce cas-là.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Je suis surpris, CeRegOpenKeyEx() demande explicitement une LPCWSTR et non pas une LPCTSTR comme la version Desktop.

    Le plus simple pour ça, c'est LPCWSTR keyName = L"Ident";.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2012
    Messages : 17
    Par défaut Ca maaaaaaaaaarche !
    Bonjour Medinoc et Leternel

    Ca marche ! Plus d'erreur à la compil avec un simple "LPCWSTR keyName = L"Ident"

    Effectivement notre LPCWSTR est bien issu d'un typdef a base de wchar_t déclaré dans winnt.h. Au passage, comment mon projet sait qu'il doit intégrer ce .h ?
    typedef wchar_t WCHAR; // wc, 16-bit UNICODE character et quelques lignes plus bas typedef CONST WCHAR *LPCWSTR, *PCWSTR;Ce qui me gène c'est de ne pas trop comprendre comment et pourquoi ça marche !

    Y-a-t-il quelque-part un bon tuto sur ce L avant mon litteral.

    Merci de vos réponses. On se sent moins seul face au clavier !

    Bonne soirée et encore merci.

    PS:
    Vu le projet sur lequel je travail ce ne sera surement pas mon dernier message sur ce forum....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/12/2009, 11h57
  2. Comment initialiser une liste de composants avec une boucle ?
    Par EricSid dans le forum Composants VCL
    Réponses: 5
    Dernier message: 06/04/2005, 18h46
  3. Comment initialiser une ChildFrame ???
    Par loupdeau dans le forum MFC
    Réponses: 14
    Dernier message: 22/03/2005, 13h28
  4. Réponses: 5
    Dernier message: 15/02/2005, 18h07
  5. Réponses: 3
    Dernier message: 28/09/2003, 10h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo