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

Langage Delphi Discussion :

Modif. d'un 'REG_BINARY' dans registre (2000/XP)...


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 7
    Par défaut Modif. d'un 'REG_BINARY' dans registre (2000/XP)...
    J'ai fait pas mal de recherches sur NGscan, mais étant extrêmement bête, j'ai pas réussi à en tirer ce que je voulais exactement (on a parfois du mal à adapter les soluc' des autres qd on a une idée bien précise en tête :s)

    Je souhaite simplement modifier une valeur de type 'REG_BINARY' dans le registre, et faire passer une valeur 'Window State' de '01 00 00 00' à '02 00 00 00'... Opération en apparence simple, mais qui ne cesse de me causer des problèmes de mise en oeuvre. j'ai donc suivi l'aide en ligne de Delphi, qui est relativement claire sur la nécessité d'utiliser un 'buffer' pour stocker la valeur binaire à écrire dans le registre. Je fais dc. jusqu'alors ->

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     var: Buffer: array[1..8] of byte; // le 'byte' est-il préconisé ?
     
    begin
      Buffer := comment mettre ma valeur '02 00 00 00' ici ??
      Reg.Create := TRegistry.Create;
      Reg.Rootkey := HKEY_CURRENT_USER;
      Reg.OpenKey('macléàouvrir', false); //false, on ne la crée pas si elle existe pas
      Reg.WriteBinaryData('WindowState', Buffer, SizeOf(Buffer));
      Reg.CloseKey;
      Reg.Free;
    end;
    J'ai cru comprendre au cours de mes recherches qu'il fallait initialiser ce buffer à l'aide d'une boucle... ok mais je vois vraiment pas comment mettre '02 00 00 00' à l'aide d'une boucle, en plus ça me parait démesurément compliqué pour une si petite valeur...

    Voilà.. peut etre que je me prends trop la tête, c sûrement plus simple qu'il n'y parait, je précise j'ai Delphi 7, et bien sûr, j'utilise 'objet 'TRegistry' dans le cas présent...

    Un grand merci à tous pour ce superbe forum que je consulte avidemment ts les jours -pour un oui ou pour un non d'ailleurs- par ailleurs je recommande aussi le fabuleux moteur Ngscan ->

    http://www.ngscan.com/engine/ngscan.dll

    ... quand c bouché ici

  2. #2
    Membre émérite
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Par défaut
    Tu n'es vraiment pas loin de la réponse. L'initialisation du buffer est dépendante de ce que tu va en faire et surtout de sa taille. Il est évident que l'on n'initialise pas un entier comme un tableau de 2Mo. Dans ton cas, l'initialisation d'un tableau "à la main" est tout à fait faisable comme tu peux le voir dans le code suivant (variable bufferTableau). Il est également possible d'utiliser un type qui fait exactement la taille des données que tu veux enregistrer. Dans ton exemple, les données représentent un entier sur 32 bits (4 octets et non 8 octets come tu l'avais écrit), on peut donc utiliser un entier long signé ou non et lui affecter la valeur directement (attention au sens).
    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
     
    var
      BufferTableau: array [0..3] of byte;
      BufferEntier: LongWord;
      Reg: TRegistry;
    begin
      bufferTableau[0]:= $02;
      bufferTableau[1]:= $00;
      bufferTableau[2]:= $00;
      bufferTableau[3]:= $00;
      BufferEntier:= $00000002; // L'octet de poids faible est à droite
     
      Reg := TRegistry.Create;
      Reg.Rootkey := HKEY_CURRENT_USER;
      if Reg.OpenKey('Software\developpez.com', true) then
      begin
        Reg.WriteBinaryData('Tableau', BufferTableau, SizeOf(BufferTableau));
        Reg.WriteBinaryData('EntierLongNonSigné', BufferEntier, SizeOf(BufferEntier));
        Reg.CloseKey;
      end;
      Reg.Free;
    end;

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 7
    Par défaut
    ... Pas loin de la réponse, n'empêche que j'aurais pas trouvé en un clin d'oeil sans ton aide, ô maître Pierre . En fait les post sur Ngscan traitaient surtout de la première solution que tu m'exposes là, à savoir 'l'initialisation d'un tableau de 2Mo', et préconisaient logiquement l'emploi de boucles ... qui s'avérent inutiles dans mon cas.

    Reste que nombreux sont ceux qui se sont déjà posé la question -j'imagine- de savoir changer une valeur binaire dans le registre, et que les solutions données, aussi bien dans l'aide en ligne, que sur les différents forums, ne sont -a priori- pas très explicites sur le sujet. J'espère que ce thread aura comblé une lacune

    PS: je pensais que seules les valeurs hexa étaient précédées du '$', je savais pas que ça s'appliquait aussi aux binaires :o
    Ah oui, je précise aussi que dans mon cas, j'ai utilisé la 2e solution que Pierre m'a proposé, à savoir l'usage de la variable de type LongWord 'BufferEntier' -> C largement suffisant -apparemment- pour modifier une valeur du genre '02 00 00 00' dans le registre.
    Ah et merci pour la rectification au sujet de la taille du 'array' !!
    Pierre, T trop fort, continue comme ça !!

  4. #4
    Membre émérite
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Par défaut
    PS: je pensais que seules les valeurs hexa étaient précédées du '$', je savais pas que ça s'appliquait aussi aux binaires
    Tout dépend ce que tu appelle binaire. La valeur de la base de registre dont tu parle est affichée par regedit sous forme hexadécimale. Il est donc logique de l'écrire de cette façon. Ce que l'on appelle généralement données binaires c'est une série d'octets autre que du texte. C'est juste un abus de langage. Rien à voir en tous cas avec des valeurs binaires au sens strict.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 7
    Par défaut
    ... T'es trop fort quand même ...

    P.S: moi aussi quand je serai grand un jour, je répondrai aux questions des gens du forum !

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

Discussions similaires

  1. [WD11] Lire un REG_BINARY dans la base de registre
    Par Garfield5792 dans le forum WinDev
    Réponses: 2
    Dernier message: 21/04/2009, 12h51
  2. [Registry] Modification d'un objet dans le registre
    Par Verboz dans le forum Autres composants
    Réponses: 3
    Dernier message: 14/12/2006, 21h22
  3. Réponses: 9
    Dernier message: 22/06/2005, 08h45
  4. Modif d'un ini dans une combo box
    Par Julien.alkaza dans le forum C++Builder
    Réponses: 5
    Dernier message: 03/04/2005, 23h39
  5. Réponses: 8
    Dernier message: 28/04/2004, 16h53

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