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

  1. #1
    Membre du Club Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Points : 51
    Points
    51
    Par défaut Problème de Conversion CString vers UCHAR* ou bien problème avec la fonction de l'API PowerWriteFriendlyName ?
    Bonjour tout le monde,

    J'ai le bout de code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    DWORD dwCreateNameSize = _MAX_PATH;
    CString cTmp("abcdef");
    unsigned char * pTest = (unsigned char*)cTmp.GetBuffer(cTmp.GetLength());
    PowerWriteFriendlyName(NULL, PowerSchemeGuid, NULL, NULL, pTest, dwCreateNameSize);
    Quand je regarde le panneau de configuration( partie profils énergétiques) je trouve que le nom crée est en caractères "chinoix" Je sais pas si le problème provient de la conversion ou bien de la fonction PowerWriteFriendlyName

    Remarque: Quand je regarde avec le debogueur de vs2008, je vois que pTest contient la bonne chaine "abcdef" !!

    Merci pour toute indication !

    IDE: VS2008
    Système: Windows Seven

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    CString::GetBuffer() retourne un LPTSTR. Si ton programme est compilé avec le support Unicode la chaine retournée est donc de type wchar_t*.

    PowerWriteFriendlyName() attend un UCHAR* pour l'argument Buffer:
    http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx

    Il y a de forte chance que tu lui passe en fait un wchar_t* en lieu et place d'un unsigned char*.

    Il suffit d'utiliser un CStringA (CStringA::GetBuffer() retourne un char*)

    Note aussi que la taille de ton buffer n'est pas _MAX_PATH mais la longueur de ta chaine + le caractère NULL:

    Citation Envoyé par "MSDN
    BufferSize [in]

    The size of the friendly name specified by the Buffer parameter, including the terminating NULL character.
    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	CStringA cTmp("abcdef");
    	DWORD dwCreateNameSize = cTmp.GetLength() + sizeof(char);
    	char * pTest = cTmp.GetBuffer();
    	PowerWriteFriendlyName(NULL, PowerSchemeGuid, NULL, NULL, (UCHAR*)pTest, dwCreateNameSize);
    
    	//...
    
    	cTmp.ReleaseBuffer();
    	pTest = NULL;

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    C'est bizarre, la doc dit aussi que Buffer doit être exprimé en wide characters.

    Là, je ne comprends pas pourquoi ils en ont fait un UCHAR*, alors qu'ils avaient à portée les types WCHAR*, BYTE*, VOID*... Surtout que ça ne peut pas être un reliquat d'une vieille fonction, vu qu'elle date de Vista...
    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.

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    C'est bizarre, la doc dit aussi que Buffer doit être exprimé en wide characters.

    Là, je ne comprends pas pourquoi ils en ont fait un UCHAR*, alors qu'ils avaient à portée les types WCHAR*, BYTE*, VOID*... Surtout que ça ne peut pas être un reliquat d'une vieille fonction, vu qu'elle date de Vista...
    Bien vu Médinoc! Je m'étais arrêté à la déclaration de la fonction qui spécifiait UCHAR*, mais le reste de la doc spécifie bien Unicode...

    Buffer [in]

    The friendly name, in wide (Unicode) characters.
    Je crois que vu le problème du P.O je pense que la fonction attends bien un UCHAR* pour l'argument Buffer (ceci dit, je n'ai pas testé en live).

    Effectivement, c'est assez étrange qu'ils n'aient pas utilisé Unicode pour une fonction récente...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    C'est bien le problème: Ils utilisent Unicode, mais pas le type approprié...
    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.

Discussions similaires

  1. Problème de conversion Stream vers PByte
    Par Clorish dans le forum Langage
    Réponses: 20
    Dernier message: 20/11/2007, 20h25
  2. Probléme de conversion char vers datetime
    Par locs dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 28/02/2007, 16h29
  3. Problème de conversion TeX vers DVI
    Par Faith's Fall dans le forum Editeurs / Outils
    Réponses: 7
    Dernier message: 20/10/2006, 11h46
  4. Problème de conversion decimal vers Hexa
    Par Elbarto dans le forum C++
    Réponses: 1
    Dernier message: 06/02/2006, 20h37
  5. [MFC] Problème de conversion CString vers Char *
    Par Darkenshin dans le forum MFC
    Réponses: 10
    Dernier message: 02/12/2005, 15h42

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