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

Qt Discussion :

windows et GetUserName


Sujet :

Qt

  1. #1
    Membre régulier
    Avatar de alpha_one_x86
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Points : 113
    Points
    113
    Par défaut windows et GetUserName
    Bonjour,
    Je tant par le code suivant d'afficher le user name puis de l'encoder en hexa:
    Code : 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
    19
    20
    21
    22
    23
    24
    #if defined (Q_OS_WIN32) || defined (Q_OS_WINCE)
    /** \brief Return the encoded user name
    \return Return the encoded user name open with session */
    QString UltracopierWindowsGetUserName()
    {
    	QString userName;
    	DWORD size=0;
    	if(GetUserName(NULL,&size) || (GetLastError()!=ERROR_INSUFFICIENT_BUFFER))
    	{
    	}
    	else
    	{
    		WCHAR * userNameW=new WCHAR[size];
    		if(GetUserName(userNameW,&size)){
    			userName.fromWCharArray(userNameW,size*2);
    			DEBUGCONSOLE(90,"UltracopierWindowsGetUserName","userName before encoding: \""+userName+"\"");
    			userName=QString(QByteArray((char*)userNameW,size*2-2).toHex());
    		}
    		delete userNameW;
    	}
    	DEBUGCONSOLE(90,"UltracopierWindowsGetUserName","userName: \""+userName+"\"");
    	return userName;
    }
    #endif
    Bizarement mon fromWCharArray() me retourne une chaine vide, et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QByteArray((char*)userNameW,size*2-2
    Me retourne 7500730065007200 pour le nom d'utilisateur: "user"
    En utf16 ça devrai étre les 00 avant: 0075007300650072
    J'aimerai savoir si j'ai tord, et les causes du problème (qu'es que j'ai mal fait).
    Merci d'avance de votre aide.

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Je te propose de simplifier ton code en utilisant une taille fixe UNLEN + 1 pour ton buffer, ce qui te garantit d'après la doc de toujours avoir assez d'espace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    QString UltracopierWindowsGetUserName()
    {
        DWORD buffer_len = UNLEN + 1;
        WCHAR buffer[ buffer_len ];
     
        if ( !::GetUserNameW( buffer, &buffer_size ) )
        {
            qWarning() << "GetUserName() failed";
            return QString::null;
        }
     
        return QString::fromWCharArray( buffer, buffer_len );
    }

  3. #3
    Membre régulier
    Avatar de alpha_one_x86
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Points : 113
    Points
    113
    Par défaut
    Toujours le même probléme.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    ca marche sur tout les compilateur cela ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DWORD buffer_len = UNLEN + 1;
    WCHAR buffer[ buffer_len ];
    C'est pas plutôt du C? faut pas ajouter un const?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const DWORD buffer_len = UNLEN + 1;
    Toujours le même probléme.
    c'est à dire?

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    L'hexadécimal est une représentation, pas un encodage. Tu veux afficher la chaine de caractère sous forme hexadécimale ? Il te faut alors afficher un à un chaque caractère avec le bon formatage.

    Citation Envoyé par yan Voir le message
    C'est pas plutôt du C? faut pas ajouter un const?
    Ben c'est pour réutiliser la variable pour l'appel à GetUserName (c'est un paramètre in/out).

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel Voir le message
    Ben c'est pour réutiliser la variable pour l'appel à GetUserName (c'est un paramètre in/out).
    Je voulais dire, de déclarer un tableau c à partir d'une variable non const pour la taille. Normalement, seule le C le permet.
    Sous visual ca marche pas. J'ai juste modifié un peut ton 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
    19
    20
    21
    22
    23
    24
    #include "windows.h"
    #include "Winbase.h"
    #include "Lmcons.h."
    #include <QtCore>
    
    
    int main(int argc, char *argv[])
    {
        const DWORD max_buffer_len = UNLEN + 1;
        DWORD buffer_len = max_buffer_len;
        WCHAR buffer[ max_buffer_len ];
    
        QString user;
        if ( !::GetUserNameW( buffer, &buffer_len ) )
        {
                qWarning() << "GetUserName() failed";
        }
        else
        {
             qDebug() << QString::fromWCharArray( buffer);
        }
        return 0;
    }

  7. #7
    Membre régulier
    Avatar de alpha_one_x86
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Points : 113
    Points
    113
    Par défaut
    Le problème c'est que je reçois en hexa:
    7500730065007200
    C'est normal?
    Je croyait que tout été en unicode utf16 (lettre W aprés le nom de la function).
    Hors en encodage utf16, le code hexa correspondant serai plutot:
    0075007300650072

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par alpha_one_x86 Voir le message
    Le problème c'est que je reçois en hexa:
    7500730065007200
    C'est normal?
    Je croyait que tout été en unicode utf16 (lettre W aprés le nom de la function).
    Hors en encodage utf16, le code hexa correspondant serai plutot:
    0075007300650072
    ha je viens de comprendre ton problème...
    Pour faire simple, c'est un problème d'endian de tes données. Quand tu fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QByteArray((char*)userNameW,size*2-2).toHex()
    tu n'en tien pas compte.
    Si c'est de l'utf16 que tu veut afficher en hexa, il te faut ajouter tes caractère un après l'autre avec le bon endian dans un QByteArray et de convertir ton QByteArray en hexa.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    QByteArray array;
    QDataStream out(&array,QIODevice::WriteOnly);
    for (int i =0; i <buffer_len;++i)
    {
        out << buffer[i];
    }
    qDebug() << array.toHex();

  9. #9
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par yan Voir le message
    Je voulais dire, de déclarer un tableau c à partir d'une variable non const pour la taille. Normalement, seule le C le permet.
    Ah oups ! J'avais un doute mais je pensais que c'était l'inverse. Bien vu

  10. #10
    Membre régulier
    Avatar de alpha_one_x86
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Points : 113
    Points
    113
    Par défaut
    On peu pas utilisé un fonction type:
    http://qt.developpez.com/doc/4.5/qtendian/
    ?

    Que je mette dans les bon terme ma doc, GetUserNameW() retourne quel encodage? (endian c'est quoi? un encodage? une histoire de poids fort poids faible?)

    Merci d'avance.

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par alpha_one_x86 Voir le message
    On peu pas utilisé un fonction type:
    http://qt.developpez.com/doc/4.5/qtendian/
    ?
    Tu devra refaire ce que fait déjà QDataStream.

    GetUserNameW() retourne quel encodage?
    de l'utf16 je crois. Mais je n'ai aucune certitude. Ca peut peut être dépendre de l'encodage de la version de windows. QString travaille en utf16 (normalement), tu peut donc l'utiliser pour être sur de toi.

    endian c'est quoi? un encodage? une histoire de poids fort poids faible?
    histoire de poids fort, poids faible.

  12. #12
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Si tu parcours un à un les caractères de ta chaîne, tu n'auras pas de problème d'endianness.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    QString result;
    for ( DWORD i = 0; i < buffer_len; ++i )
    {
        result += QString::number( buffer[ i ], 16 );
    }
    qDebug() << result;
    Le W à la fin de GetUserName veut dire Wide par opposition à Ansi. Ca veut simplement dire que les caractères sont codés sur 16 bits (WCHAR). L'encodage utilisé est UTF-16 depuis Win2k.

Discussions similaires

  1. [Windows]accès base de registre windows
    Par Greg01 dans le forum API standards et tierces
    Réponses: 27
    Dernier message: 05/06/2007, 15h14
  2. Documentation gratuite sur l'API Windows, COM, DCOM, OLE, etc.
    Par Community Management dans le forum Windows
    Réponses: 1
    Dernier message: 16/11/2006, 15h28
  3. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  4. OmniORB : code sous Windows et Linux
    Par debug dans le forum CORBA
    Réponses: 2
    Dernier message: 30/04/2002, 17h45
  5. Quel désassembleur/assembleur pour un exe Windows ?
    Par Anonymous dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 17/04/2002, 10h59

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