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

Windows Discussion :

Petite question sur LPTSTR


Sujet :

Windows

  1. #1
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 93
    Points : 46
    Points
    46
    Par défaut Petite question sur LPTSTR
    Salut à tous !
    Je débute la programmation windows C à l'aide des api.
    Je suis confronté à un petit probleme:
    Comment afficher une variable de type LPTSTR à l'écran.
    Je ne comprends pas our chercher , je ne trouve pas dans msdn quelque chose qui pourrait m'aider mise à part wsprintf qui plante le programme .....
    LPTSTR string;
    GEtSystemDirectory(string,10);
    printf("string = %s",string);

    Ce bout de code n'affiche rien apres le egale...

    Merci !

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    LPTSTR est un typedef vers TCHAR *.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef TCHAR * LPTSTR;
    TCHAR étant défini comme étant tout simplement CHAR (char) si UNICODE n'est pas définie et WCHAR (wchar_t) si elle est définie (c'est-à-dire si tu mets par exemple #define UNICODE avant les headers). Attention, sous Visual C++ 2005, UNICODE est par défaut définie. Pour annuler sa définition, on peut tout simplement mettre #undef UNICODE avant les headers. C'est-à-dire :
    Est équivalent à :Si UNICODE n'est pas définie et :Si UNICODE est définie.

    Pour récupérer le répertoire système (C:\WINDOWS\system32), il faut passer un tableau assez grand à la fonction GetSystemDirectory et non un simple pointeur vers un caractère (LPTSTR). Le bon code est donc, si UNICODE n'est pas définie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h> /* pour printf */
    #include <windows.h>
    
    int main()
    {
        char s[100];
        
        GetSystemDirectoryA(s, sizeof(s) / sizeof(s[0]));
        printf("s = %s\n", s);
        
        return 0;
    }
    Et si UNICODE est définie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h> /* pour wprintf */
    #include <wchar.h> /* pour wprintf */
    #include <windows.h>
    
    int main()
    {
        wchar_t s[100];
        
        GetSystemDirectoryW(s, sizeof(s) / sizeof(s[0]));
        wprintf(L"s = %s\n", s);
        
        return 0;
    }
    Et la version portable (au sens où l'entend Microsoft ...), c'est-à-dire qui compile avec ou sans UNICODE:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h> /* pour _tprintf */
    #include <tchar.h> /* pour _tprintf */
    #include <windows.h>
    
    int main()
    {
        TCHAR s[100];
        
        GetSystemDirectory(s, sizeof(s) / sizeof(s[0]));
        _tprintf(TEXT("s = %s\n"), s);
        
        return 0;
    }

  3. #3
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 93
    Points : 46
    Points
    46
    Par défaut
    Je ne comprends pas... c'est l'argument qui est requis dans la déclaration de la fonction... ET d'après ce que je comprends ici http://msdn2.microsoft.com/en-us/lib...73(VS.85).aspx LPTSTR pointe sur un tableau de caractères... pourquoi alors ne pas pouvoir utiliser directement .
    Par définition LPTSTR est un pointeur sur une chaine de caractère non?

    Quelque chose m'échappe !!!

  4. #4
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 379
    Points
    20 379
    Par défaut
    Si tu n'as pas besoin de livrer ton appli sur des OS "exotiques" donc avoir recours à unicode un simple char buffer[256] suffit ( 256 c'est la taille de _MAX_PATH)

    Citation Envoyé par swingNJava Voir le message
    Je ne comprends pas... c'est l'argument qui est requis dans la déclaration de la fonction... ET d'après ce que je comprends LPTSTR pointe sur un tableau de caractères... pourquoi alors ne pas pouvoir utiliser directement .
    Par définition LPTSTR est un pointeur sur une chaine de caractère non?

    Quelque chose m'échappe !!!
    Utiliser directement je ne comprends pas ce que tu veux dire.
    En plus la taile fixée par GetSystemDirectory est trop petite..

    Au besoin prendre wprintf au lieu de printf comme l'illustre Melem pour que cela s'affiche correctement.
    En unicode les tableaux de charactêres sont sur 16 bits ce sont des unsigned short ( à vérifier ) et en ANSI de simples char.
    Donc printf("%s....) affichera mal la chaine..



    ->Melem oui Unicode est défini par défaut mais dans les options du projet on peut le définir sans utilisation d'unicode sous Vs 2005

  5. #5
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 93
    Points : 46
    Points
    46
    Par défaut
    Par directement j'entends déclarer simplement une variable LPTSTR et la passer directement à la fonction....

  6. #6
    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 519
    Points
    41 519
    Par défaut
    LPTSTR, c'est un pointeur non-const vers des TCHAR.
    C'est bien ce dont la fonction a besoin: Un tableau de caractères où écrire.

    Il lui faut donc l'adresse d'un tableau de TCHAR (pour être précis, l'adresse du premier élément du tableau), et sa taille. C'est bien ce que fait ce code:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <stdio.h> /* pour _tprintf */
    #include <tchar.h> /* pour _tprintf */
    #include <windows.h>
     
    #ifndef ARRAYSIZE /*ARRAYSIZE() n'est pas définie sous MinGW*/
    #define ARRAYSIZE(x) ((sizeof x)/(sizeof x[0]))
    #endif
     
    int main(void)
    {
    	/* On passe à la fonction un tableau de TCHAR et sa longueur */
    	TCHAR s[100];
    	GetSystemDirectory(s, ARRAYSIZE(s));
     
    	/* On affiche. */
    	_tprintf(TEXT("s = %s\n"), s);    
    	return 0;
    }
    Naturellement, pour bien faire, il faudrait vérifier que la fonction a réussi avant d'afficher, car sinon le contenu du buffer est indéfini...
    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.

  7. #7
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 93
    Points : 46
    Points
    46
    Par défaut
    OK. EN fait la fonction ne créer pas de tableau et ne modifie donc pas le pointeur LPTSTR pour le diriger vers ce tableau, c'est a nous de passer l'adresse du tableau et la fonction s'occupe d'écrire le résultat dedans...

    MErci pour toutes ces réponses !!

  8. #8
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par swingNJava Voir le message
    Par directement j'entends déclarer simplement une variable LPTSTR et la passer directement à la fonction....
    Il faut passer un tableau à la fonction. Si tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TCHAR c, t[100];
    LPTSTR p;
    Tu peux aussi bien écrire :
    que :Si tu ne comprends pas pourquoi tu dois réviser ton cours de C, c'est pas ici, en programmation Windows, qu'on apprend cela.

    Mais, tu ne peux pas passer &c (car un caractère est insuffisant pour contenir la chaîne renvoyée) et moins encore un pointeur non initialisé à GetSystemDirectory, il faut passer un tableau.

    SI tu veux toujours utiliser un "vrai" LPTSTR, alors tu dois allouer toi-même la mémoire à utiliser (c'est du domaine du C standard : allocation dynamique de mémoire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LPTSTR p = malloc(100 * sizeof(TCHAR));
    ... Tu peux alors passer p à GetSystemDirectory ...
    free(p);

  9. #9
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 93
    Points : 46
    Points
    46
    Par défaut
    Oki, je vois !

    merci à tous pour toutes ces précisions !

Discussions similaires

  1. [ATL] Petite question sur les progress bar
    Par MrMaze dans le forum MFC
    Réponses: 1
    Dernier message: 06/05/2005, 09h40
  2. [Visuel XP] Petite question sur le theme XP...
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 12
    Dernier message: 20/01/2005, 14h41
  3. petite question sur le composant IBX ...
    Par vbcasimir dans le forum Bases de données
    Réponses: 4
    Dernier message: 05/01/2005, 10h33
  4. Réponses: 3
    Dernier message: 08/12/2004, 13h58
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

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