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 :

Migration 2005 ->2008 : 'char *' to 'LPWSTR'


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 45
    Points : 25
    Points
    25
    Par défaut Migration 2005 ->2008 : 'char *' to 'LPWSTR'
    Bonjour,

    Je dois migrer un projet de Visual Studio 2005 à 2008 (avec un changement de la version du SDK de V5 à V6.0A) et il y a un bout de code qui ne compile plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        wchar_t WDirectoryToShare[MAX_PATH];
        wchar_t WSharename[MAX_PATH];
     
        swprintf_s(WDirectoryToShare,L"%S",DirectoryToShare);
        swprintf_s(WSharename,L"%S",Sharename);
     
        si502.shi502_netname = (char *)WSharename;     // ici erreur de compilation
        si502.shi502_max_uses = SHI_USES_UNLIMITED;
        si502.shi502_current_uses = 0;
        si502.shi502_path = (char *)WDirectoryToShare;	 // ici erreur de compilation
    J'ai parcouru les 3 fichiers du SDK concernés et il y a le typedef suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     typedef __nullterminated WCHAR *NWPSTR, *LPWSTR, *PWSTR;
    puis
    et un typedef struct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    typedef struct _SHARE_INFO_502 {
        LMSTR     shi502_netname;
        DWORD     shi502_type;
        LMSTR     shi502_remark;
        DWORD     shi502_permissions;
        DWORD     shi502_max_uses;
        DWORD     shi502_current_uses;
        LMSTR     shi502_path;
        LMSTR     shi502_passwd;
        DWORD     shi502_reserved;
        PSECURITY_DESCRIPTOR  shi502_security_descriptor;
    } SHARE_INFO_502, *PSHARE_INFO_502, *LPSHARE_INFO_502;
    Le compilateur n'admet pas donc pas le cast d'un wchar_t en WCHAR.
    Il met 2 erreurs de compilation du type :
    error C2440: '=' : cannot convert from 'char *' to 'LPWSTR'

    Que dois-je faire alors ?

    J'ai joint les 3 fichiers du SDK concernés.

    Merci.

    Tapiou.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre actif Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Points : 281
    Points
    281
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    si502.shi502_netname = (char *)WSharename;
    netname est une LPWSTR, il ne faut pas caster en char* (ce qui est une très mauvaise facon de faire dans tous les cas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    si502.shi502_netname = WSharename.c_str();

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Merci bcp une fois de plus

    Tapiou.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Octobre 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Bonjour,

    Hélas çà ne compile pas avec l'erreur suivante :
    error C2228: left of '.c_str' must have class/struct/union
    type is 'wchar_t [260]'

    Je ne sais pas si Rewpparo est là alors si quelqu'un veut bien m'aider, son aide sera la bienvenue.

    Merci.

    Tapiou.

  5. #5
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 474
    Points
    11 474
    Billets dans le blog
    11
    Par défaut
    Et bien tu as donc une chaine WSharename qui est déclarée en tant que wchar_t [] donc qui est déjà un LPWSTR. Tu as donc juste à enlever le cast pour que ça fonctionne
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  6. #6
    Nouveau membre du Club
    Inscrit en
    Octobre 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Merci beaucoup, çà marche.

    Mais un peu plus loin, j'ai la même erreur de compilation sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    nas = NetShareAdd(
    	    (Server ? (char *)WServer : Server),
                 502,           
                (LPBYTE)&si502,
                NULL            
                );
    L'erreur est :

    "error C2664: 'NetShareAdd' : cannot convert parameter 1 from 'char *' to 'LPWSTR'
    Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast"

    alors j'ai retiré le (char *) devant WServer mais là, j'ai l'erreur de compilation :
    "error C2446: ':' : no conversion from 'LPTSTR' to 'wchar_t *'
    Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast"

    Il ne veut pas de char et il ne veut pas de wchar_t.

    Je ne comprends pas ce qu'il veut.

    D'avance, merci ...

    Tapiou.


    Nota : NetShareAdd est défini dans LMShare.h joint en début de topic comme çà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    NetShareAdd (
        __in_opt IN  LMSTR   servername,
        IN  DWORD   level,
        __inout IN  LPBYTE  buf,
        __out_opt OUT LPDWORD parm_err
        );

  7. #7
    Membre actif Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Points : 281
    Points
    281
    Par défaut
    La variable Server c'est quoi ?

  8. #8
    Nouveau membre du Club
    Inscrit en
    Octobre 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    argh réveil nocturne

    LPTSTR Server;

  9. #9
    Membre actif Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Points : 281
    Points
    281
    Par défaut
    "error C2446: ':' : no conversion from 'LPTSTR' to 'wchar_t *'
    Bizarre. Normalement LPTSTR est un wchar_t*.
    Tu compiles bien avec l'option unicode ?

  10. #10
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 474
    Points
    11 474
    Billets dans le blog
    11
    Par défaut
    (Server ? WServer : Server)Je pense que ce test est faux :
    Si Server n'est pas nul on prend WServer mais s'il est nul c'est Server (donc NULL) qu'on prend.
    Ne voulais-tu pas faire l'inverse plutôt (ce qui me semblerait plus logique)
    (Server ? Server : WServer)Par contre ça ne résoudra pas ton problème de conversion.
    Je te suggère de vérifier si tu compiles bien en Unicode, comme te l'a dit Rewpparo.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  11. #11
    Nouveau membre du Club
    Inscrit en
    Octobre 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Merci tous les 2.

    Mais je compile bien en Unicode :
    Je suis sous Visual 2008 et j'ai Yes dans "Use UNICODE Response Files" du champ General de Linker.

    Je ne dois pas changer le test même s'il est faux (...) mais juste compiler sous Visual 2008 ce qui compilait avant sous Visual 2005.

    Et cette ligne, donc :
    (Server ? (char *)WServer : Server),

    ne compile pas en me disant :
    error C2664: 'NetShareAdd' : cannot convert parameter 1 from 'char *' to 'LPWSTR'

    Gloups !

    Tapiou.

  12. #12
    Membre actif Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Points : 281
    Points
    281
    Par défaut
    Déjà enlèves le char*, ca c'est sur. C'est juste débile de caster un wchar_t* en char* sans traitement, même les caractères français comme é buguent avec ca.
    Si ca compile toujours pas, je vois vraiment pas, normalement ca marche. Un message comme "cannot convert parameter 1 from 'wchar_t *' to 'LPWSTR'" n'a pas de sens car LPWSTR est un wchar_t*.
    Peut etre un include qui manque ? windows.h ?

  13. #13
    Nouveau membre du Club
    Inscrit en
    Octobre 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Salut Rewpparo et dragonjoker59,

    Pour windows.h, le include est entre commentaires en haut du fichier mais avec sans, même erreur de compil.

    Mais j'ai mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    nas = NetShareAdd(
              (Server ? WServer : (LPWSTR)Server),         
               502,         
              (LPBYTE)&si502,
               NULL            
            );
    et là çà compile.

    Qu'est-ce que vous en dites ?

    Sinon dragonjoker59, je vais dire à mon chef que le test est peut-être faux ... çà pourrait servir de le savoir

    Tapiou.

  14. #14
    Membre actif Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Points : 281
    Points
    281
    Par défaut
    Oui, c'est normal que ca marche. Le problème c'est que ca ne résout rien, ca cache juste le message d'erreur à la compilation. Le cast du C ne garanti pas du tout la compatibilité des données entre elles, et il vaut mieux le remplacer par static_cast (ou un autre *_cast) quand c'est possible.
    En même temps le code contenait à la base un cast vers char*, ce qui n'est pas beaucoup mieux de toutes facons, donc bon....

  15. #15
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Points : 2 627
    Points
    2 627
    Par défaut
    Citation Envoyé par tapiou Voir le message
    Je dois migrer un projet de Visual Studio 2005 à 2008 (avec un changement de la version du SDK de V5 à V6.0A)
    Salut,
    J'arrive un peu tard, mais là tu cummules 2 migrations : IDE (compilo) + SDK.

    Il aurait fallu y aller par étapes :
    - Origine : VS 2005 + SDK 5 (quelle horreur !!!)
    - 1er étape : VS 2005 + SDK 6.0A
    - 2e étape : VS 2008 + SDK 6.0A

    Généralement, un changement de SDK n'est pas très problématique.
    Par contre, le changement de version de Visual, c'est plus contraignant.

  16. #16
    Nouveau membre du Club
    Inscrit en
    Octobre 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Bonjour Rewpparo,

    Merci pour ta réponse : je vais me plonger dans les static_cast pour comprendre ce que devrais mettre à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       (Server ? WServer : (LPWSTR)Server),
    sinon mala92, je vais dire à mon chef qu'il est nul mais il risque de pas apprécier ....

    Tapiou.

  17. #17
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 474
    Points
    11 474
    Billets dans le blog
    11
    Par défaut
    Moi j'aimerais quand même bien voir la ligne de déclaration de WServer et Server.
    Ensuite, le champ "Use UNICODE Response Files" ne définit pas la compilation en Unicode mais juste que les fichiers générés (logs, toussa) seront en Unicode.
    Pour savoir si tu compiles en Unicode, il faut aller voir dans les propriétés du projet, "Général", "Jeu de caractères".
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  18. #18
    Nouveau membre du Club
    Inscrit en
    Octobre 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    dragonjoker59,

    Dans les propriétés du projet, "Général", "Jeu de caractères" : j'ai mis maintenant Use Unicode Character Set (c'était à Not set avant) et du coup

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Server ? WServer : Server),
    compile

    Merci !

    Avec des dizaines d'autres projets que j'ai migré de Visual Studio 2005 à Visual Studio 2008, qui ont tous Use Unicode Character Set à la valeur Not set, je n'ai pas eu de problème.

    Qu'est-ce qu'il faut que je fasse ? Est-ce que c'est grave si ils n'ont pas "Use Unicode Character Set" de positionné ?

    Merci.

    Tapiou.

  19. #19
    Membre actif Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Points : 281
    Points
    281
    Par défaut
    Il y a un type qui est pas mal utilisé dans les API Windows, c'est le TCHAR. Si tu compiles sans unicode activé, TCHAR est un char. Avec Unicode, ca devient wchar_t.
    LPTSTR est un TCHAR* et est apparemment utilisé pas mal dans ton code. Si tes données sont des char* majoritairement, il vaut mieux ne pas utiliser Unicode. si c'est des wchar_t* majoritairement, utilises Unicode.
    Mais l'idéal si tu as plusieurs projets c'est d'avoir la même convention pour tous. Donc je te conseille d'en choisir un et de t'y tenir, éventuellement avec les conseils de ton boss.
    Mais dans les problèmes qu'on a résolu avant, il me semble que tu étais avec Unicode activé. Vérifie tes projets, mais je pense que dans ton cas il vaut mieux utiliser Unicode.

  20. #20
    Nouveau membre du Club
    Inscrit en
    Octobre 2011
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Merci

    Tapiou.

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

Discussions similaires

  1. [SQL-Server] Migration 2005 vers 2008 et mssql_ ne fonctionne plus
    Par arthuro45 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 22/07/2011, 08h58
  2. Migration Visual Studio 2005 vers 2008
    Par trueman dans le forum Visual Studio
    Réponses: 0
    Dernier message: 01/06/2011, 15h41
  3. Migration Visual studio 2008 à Visual studio 2005
    Par amirad dans le forum VB.NET
    Réponses: 2
    Dernier message: 23/09/2009, 11h18
  4. [Transact] Migration 2005 vers 2008 et Datetime
    Par Stouille33 dans le forum Développement
    Réponses: 3
    Dernier message: 26/02/2009, 15h57

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