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

Python Discussion :

winreg et valeur hexa


Sujet :

Python

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 6
    Points
    6
    Par défaut winreg et valeur hexa
    Bonjour a tous,

    Je suis en train de créer un script python qui doit changer les clés dans la base de registre de windows.
    pour cela j'utilise _winreg

    j'arrive assez bien a utiliser ce module, sauf pour une clé que je dois ajouter.

    Cette clé est de type REG_DWORD est doit avoir comme valeur 0x80000001, donc mon code est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                key = _winreg.OpenKey( _winreg.HKEY_LOCAL_MACHINE,'CheminDeMaClé',0,_winreg.KEY_SET_VALUE)
                _winreg.SetValueEx(key,'HKeyRoot',0,_winreg.REG_DWORD, 80000001)
                _winreg.CloseKey(key)
    Sauf que cela ecrit 80000001 en décimal, ce qui donc n'est pas du tout la même valeur.

    J'ai tenté décrire 0x80000001 mais ça ne marche pas

    0x80000001 = 2147483649 en décimal, mais si j'essaie de mettre 2147483649 dans mon code cela génère l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <type 'exceptions.ValueError'>: Could not convert the data to the specified type.
    pourtant si dans un ficher .reg on met :
    "MaClé"=dword:80000001
    on obtient bien la clé "MaClé" avec comme valeur :
    0x80000001 (2147483649)

    Quelqu'un sait-il comment rentrer cette valeur directement en hexadécimal avec _winreg ?

    Merci.

  2. #2
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Essaye avec 0x80000001, ca devrais passer.
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Le problème est que 2147483649 est vu par Python comme un long, donc il faudrait contourner ça...

  4. #4
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Il faut donc convertir la valeur en entier signé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import _winreg
     
    def int2signed(s):
        if s > 0x7fffffff:
            s -= 0x100000000
        return int(s)
     
    key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, 'SOFTWARE\\KeyTest', 0, _winreg.KEY_SET_VALUE)
    _winreg.SetValueEx(key, 'test', 0, _winreg.REG_DWORD, int2signed(0x80000001))
    _winreg.CloseKey(key)
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Merci Beaucoup DelphiManiac et Oiffrig !

    J'avais essayé de rentrer 0x80000001 déjà , je pensais l'avoir notifié dans mon post, désolé de ce petit oubli

    Avec cette méhode, je peut écrire ma clé comme je le souhaite, sujet résolu.

    Par contre je n'ai pas compris comment fonctionne ce code exactement, pourquoi en ai-je besoin (pourquoi l'erreur est-elle générée) ?
    Si vous pouviez m'éclairer sur ce point, juste pour information, et afin de pouvoir traiter moi même ce genre de bug par la suite...

    D'après le post d'Oiffrig j'en déduit que c'est un type de variable qui n'est pas adapté a un moment, mais je ne saisis pas le mécanisme dans le détail.



    Merci Encore !

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Avec Python 2 (plus avec Python 3), il y a 2 types d'entiers : int et long
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> type(0x80000001)
    <type 'long'>
    >>> type(0x7fffffff)
    <type 'int'>
    La fonction que tu utilises nécessite un int, qui sera converti en DWORD.
    Or un DWORD peut être vu comme un entier signé, la conversion pouvant justement se faire à l'aide de la fonction proposée par DelphiManiac (avec un bémol tout de même, si l'entier est supérieur ou égal à 2**32, le résultat devient faux, mais dans ton cas il sera toujours inférieur).
    Pour plus d'infos sur la représentation des entiers : http://benoit-m.developpez.com/assem.../Partie1-1.php

  7. #7
    Futur Membre du Club
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup, c'est plus clair maintenant !

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

Discussions similaires

  1. Equivalent du L en C pour les valeurs hexa
    Par Rustine dans le forum Delphi
    Réponses: 2
    Dernier message: 11/03/2007, 13h05
  2. Remplacement d'une valeur hexa dans une chaine
    Par raoulchatigre dans le forum C++
    Réponses: 7
    Dernier message: 18/09/2006, 16h27
  3. Calcul String (valeur Hexa) -> double puis double -> char *
    Par ben_ghost dans le forum VC++ .NET
    Réponses: 5
    Dernier message: 30/07/2006, 21h04
  4. Valeurs hexa en ordre inverse
    Par Micheal1221 dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 26/07/2006, 20h37
  5. Extraction des valeurs hexa d'un champ char
    Par Krispi dans le forum Fortran
    Réponses: 3
    Dernier message: 21/11/2005, 11h10

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