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

Réseau C Discussion :

Transformer char* en LPTSTR


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Par défaut Transformer char* en LPTSTR
    Bonjour tout le monde,

    Voilà mon problème, je suis en train de créer une fonction capable de déconnecter un média amovible sur l'ordinateur. Elle doit avoir comme seul paramètre d'entrée, la lettre du lecteur que l'on veut déconnecter. Pour cela j'utilise un appel système de devcon.exe, avec comme paramètre l'ID de lecteur en question.

    Je fus confronté à un problème de taille, j'ai du chercher comment faire le lien entre l'ID de la clé (hardware) et la lettre de lecteur(software).
    j'ai trouvé ce code, qui fait exactement ce que je souhaite, sauf qu'il faut rentrer dans la fonction GetSpecificDrive(devID) l'ID de la clé. Je l'ai, mais il est contenu dans un char*.. Et là est tout le problème car en entrée de la fonction, il faut entrer un type LPTSTR, jusqu'à ce jour inconnu pour moi !
    J'ai cherché, et trouvé que l'on pouvait intialiser devID avec directement la chaine que l'on voulait.. Mais le problème, et que cette chaine est constante : devID = _T("USBSTOR\\DISK&VEN_SONY&PROD_STORAGE_MEDIA&REV_0100\\9B4001101120009378&0");

    Il faudrait que je puisse entrer une variable, afin que je puisse utiliser cette fonction dans une boucle..

    J'ai essayé :
    char* usb_ID;
    devID = _T(usb_ID);

    Et cela ne fonctionne strictement pas..

    Si quelqu'un a une idée, une piste, ou une réponse je serais sincèrement heureux de la lire !

    Cordialement,

    Antoine.

  2. #2
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 172
    Par défaut
    Salut,

    J'ai pas lu le code du lien que tu as passé et j'ai pas saisis toutes les données du problème tellement ton problème m'a sauté aux yeux! Je te conseille vivement de lire ceci et tu devrais pouvoir le régler ensuite.

  3. #3
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    A priori, un LPTSTR, c'est soit un char*, soit un wchar_t*. On trouve pas mal de truc sur le net sur le sujet, je pense que tu devrais trouver ta reponse.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  4. #4
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 172
    Par défaut
    Ce que je ne comprends pas, c'est le truc de la boucle et pourquoi tu as absolument besoin d'une variable si c'est pour une unique clé usb (si j'ai bien compris!). Copier directement la chaine de l'id dans le _T("USBTOR...") de DevID ne serait pas plus simple vu que cette chaine n'est pas succeptible de changer? Ou alors j'ai mal compris.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Par défaut
    Citation Envoyé par baccali Voir le message
    Ce que je ne comprends pas, c'est le truc de la boucle et pourquoi tu as absolument besoin d'une variable si c'est pour une unique clé usb (si j'ai bien compris!). Copier directement la chaine de l'id dans le _T("USBTOR...") de DevID ne serait pas plus simple vu que cette chaine n'est pas succeptible de changer? Ou alors j'ai mal compris.

    Justement, c'est car ce n'est pas que pour une seule clé usb !!
    J'ai besoin d'une variable, car je vais mettre les id des différentes clé dans un tableau de chaines !!

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Par défaut
    Baccali,
    Je te remercie car je comprend maintenant la différence entre l'unicode et le MBCS !

    Et j'ai finalement réussi à utiliser la fonction, en modifiant le type de la variable d'entrée. On devait rentrer du LPTSTR , et je l'ai changé en LPSTR, ce qui correspond donc à du char*, j'ai du ensuite modifier 2 - 3 choses à l’intérieur afin que certaines comparaisons se fassent quand même.

    Encore merci beaucoup !!

    Cordialement,
    Dante47.

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Je n'ai pas regardé le lien indiqué, mais

    Citation Envoyé par Dante47 Voir le message
    Si quelqu'un a une idée, une piste, ou une réponse je serais sincèrement heureux de la lire !
    es-tu sûr que unsigned char ne marche pas ???

  8. #8
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 172
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    es-tu sûr que unsigned char ne marche pas ???
    Non ça ne marchera pas car GetSpecificDrive(...) attend de l'unicode! (Dans son environnement)

    De plus _T(usb_ID) n'est pas une fonction, c'est une macro qui transforme une chaine de caractère constante en unicode ( L"..." ) ou non ( ignoré -> "..." ) en fonction de si tu souhaites faire un programme unicode aware ou non. Donc elle attend quelque chose du style _T("salut") et non une variable.

    Donc il a deux solutions :

    _ Soit il compile un programme MBCS, et là le char passera car la fonction GetSpecificDrive() attendra du MBCS. ( pour ça il faut soit retirer la macro _UNICODE et UNICODE à la compil ou si il est sous VS passer par configuration du projet->Général->Use Multibyte character set)

    _ Soit il décide de laisser son programme en UNICODE et là il passe par MBCStoUnicode().

    Bref un tour sur le lien que je lui ai donné devrait l'aider à mieux comprendre les contraintes de programmation sous windows.

    En gros sous windows tu peux soit compiler un programme unicode soit mbcs (sachant que lorsque tu compiles en mbcs, windows travaillant en unicode en interne, toutes les chaines mbcs que tu lui passes sont converties dans le noyau à l'entrée et à la sortie. Ton programme sera donc légèrement plus rapide en unicode).

    Donc lorsque tu appelles GetSpecificDrive() tu appelles en fait une macro conditionnelle qui dépend de si les macro _UNICODE et UNICODE sont définies ou non à la compilation. Si ton programme est mbcs, tu appelles en fait GetSpecificDriveA(), qui attend une chaine mbcs, et si ton programme travaille en unicode tu appelles réellement GetSpecificDriveW(), qui attend de l'unicode.

    Pour rester cohérent, au lieu de déclarer tes variable "en char *" ou "wchar *" directement et te casser la tête à faire tes propres conversions avec des vrais fonctions comme mbcstounicode et unicodetombcs, il vaut mieux déclarer tes chaines de caractères avec des macros LPTSTR, PTCHAR, TCHAR...

    LPTSTR, dans notre cas, sera convertit en "LPWSTR", soit "wchar *" si tu dévelloppes en unicode et "LPSTR", soit "char *" sinon.

    IMPORTANT : Il faut inclure Tchar.h dans tes headers.

    Voilà. Dis nous si ce n'est toujours pas clair! Mais encore une fois, fais un tour sur le lien que je t'ai passé, tout y est expliqué (je pense, je l'ai pas lu)

    Cordialement

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

Discussions similaires

  1. transformation char byte
    Par hamma2 dans le forum Langage
    Réponses: 1
    Dernier message: 23/05/2007, 12h04
  2. transformer un char en int
    Par transistor49 dans le forum C
    Réponses: 7
    Dernier message: 13/12/2005, 21h47
  3. transformer un char en binaire
    Par r0d dans le forum MFC
    Réponses: 11
    Dernier message: 05/06/2005, 13h56
  4. Réponses: 5
    Dernier message: 29/04/2005, 15h15
  5. Transformer un champ CHAR en décimal
    Par ALLB dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 19/07/2004, 13h59

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