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 :

Comment la ruche et l'arborescence d'une clé de registre est-elle choisie ?


Sujet :

Langage Delphi

  1. #1
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 294
    Points : 171
    Points
    171
    Billets dans le blog
    1
    Par défaut Comment la ruche et l'arborescence d'une clé de registre est-elle choisie ?
    Bonjour,
    Je développe une vaste DLL de fonctions de support pou run autre langage, en Delphi 6 Personal Edition, sous Windows 10 Edition familiale, dernière version, toutes mises à jour faites.

    Je souhaite créer et maintenir des informations de configuration dans des clés de registre. Pour cela, je me suis servi d'un code publié ici:
    https://www.swissdelphicenter.ch/en/showcode.php?id=301
    Après de légères modifications "cosmétiques", voici mes codes:
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    interface
      uses
        Windows, Messages, Registry, Dialogs,
        KGF_unit_types
     
    const
    // constantes pour les clés registre spécifiques à KGF.dll (uniquement des clés "string")
    //      Pour accéder à ces clés:
    //         RegWrite(Registry_Key_xxx, Registry_Value_xxx_yyy, value);
    //         value := RegRead((Registry_Key_xxx, Registry_Value_xxx_yyy);
    //      avec:
    //         xxx = module (OutlookInterface, ...)
    //         yyy = valeur (DoRecoverMissedMails, ...)
     
    //  Tous les paramètres liés à KGF.dll sont placés ici:
          Registry_RootKey = HKEY_LOCAL_MACHINE;
    //  Toutes les clés de KGF.dll sont placées ici:
          Registry_Key = 'SOFTWARE\KGF\';
    //  Clé pour OutlookInterface (unit KGF_unit_Outlook_2007.pas)
          Registry_Key_OutlookInterface = 'SOFTWARE\KGF\OutlookInterface\';
    //  Les valeurs spécifiques pour OutlookInterface sont dans la clé OutlookInterface:
          Registry_Value_OutlookInterface_DoRecoverMissedMails = 'DoRecoverMissedMails';
          Registry_Value_OutlookInterface_LastCheckTime = 'LastCheckTime';
     
    implementation
     
    // les deux modules suivants viennent de https://www.swissdelphicenter.ch/en/showcode.php?id=301
    function RegRead(Mykey, MyField: string): string;
    var
      Reg: TRegistry;
    begin
      //Create the Object
      result := '';
      Reg := TRegistry.Create;
      with Reg do begin
        //Sets the destination for our requests
        RootKey := HKEY_LOCAL_MACHINE;
        //Check if whe can open our key, if the key dosn't exist, we create it
        if OpenKey(MyKey, True) then begin
          //Is our field availabe
          if ValueExists(MyField) then
            //Read the value from the field
            Result := Readstring(MyField)
          else
            ShowMessage(MyField + ' does not exists under ' + MyKey);
        end else begin
          //There is a big error if we get an errormessage by
          //opening/creating the key
          ShowMessage('Error opening/creating key : ' + MyKey);
        end;
        CloseKey;
      end;
      Reg.Free;
    end;
     
     
    procedure RegWrite(Mykey, MyField, MyValue: string);
    var
      Reg: TRegistry;
    begin
      //Create the Object
      Reg := TRegistry.Create;
      with Reg do begin
        //Sets the destination for our requests
        RootKey := HKEY_LOCAL_MACHINE;
        //Check if we can open our key, if the key doesn't exist, we create it
        if OpenKey(MyKey, True) then begin
          //We don't need to check if the field is available because the
          //field is created by writing the value
          WriteString(MyField, MyValue);
        end else begin
          //There is a big error if we get an errormessage by
          //opening/creating the key
          ShowMessage('Error opening/creating key : ' + MyKey);
        end;
        CloseKey;
      end;
      Reg.Free;
    end;
    J'appelle ces fonctions comme suit:
    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
     
    var
      s: string;
     
    // pour la lecture:
    ...
        s := RegRead(Registry_Key_OutlookInterface, Registry_Value_OutlookInterface_DoRecoverMissedMails);
    ...
        s := RegRead(Registry_Key_OutlookInterface, Registry_Value_OutlookInterface_LastCheckTime);
    ...
     
    // pour la mise à jour:
    ...
        RegWrite(Registry_Key_OutlookInterface, Registry_Value_OutlookInterface_DoRecoverMissedMails, BoolToStr(POL.DoRecoverMissedMails));
        RegWrite(Registry_Key_OutlookInterface, Registry_Value_OutlookInterface_LastCheckTime,        FormatDateTime('yyyy/mm/dd hh:nn:ss',POL.LastTime));
    ...
    Tout fonctionne parfaitement. Les informations sont mémorisées et réutilisables lors d'un démarrage ultérieur.

    Mais, je ne comprends pas comment Windows construit l'arborescence des clés. Je voulais utiliser la ruche HKEY_LOCAL_MACHINE.
    Dans cette ruche, je veux créer la clé SOFTWARE\KGF\OutlookInterface\ avec les valeurs DoRecoverMissedMails et LastCheckTime.
    Or, voici ce qui est créé dans le registre:
    Nom : aa1.png
Affichages : 235
Taille : 27,0 Ko
    windows crée une arborescence dans une autre ruche, à savoir HKEY_CURRENT_USER. Voici le fichier *.reg extrait pour la clé créée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Windows Registry Editor Version 5.00
     
    [HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Wow6432Node\KGF]
     
    [HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Wow6432Node\KGF\OutlookInterface]
    "DoRecoverMissedMails"="-1"
    "LastCheckTime"="2021/02/25 15:41:11"
    Question: comment la ruche est-elle choisie, et comment l'arborescence de la clé est-elle construite ?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 638
    Points : 25 357
    Points
    25 357
    Par défaut
    Registry Virtualization est cherchant juste "HKEY_LOCAL_MACHINE VirtualStore" sur Google, comme pour les fichiers ini qui subissait une isolation par l'UAC plus que pénible.
    Je préfère de loin un fichier configuration et preférence en format DFM ou XML que la BDR, ça c'est si j'ai pas de base de données.

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 806
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 806
    Points : 13 497
    Points
    13 497
    Par défaut
    Il faut ajouter un manifest à l'application pour éviter la virtualisation.

    La virtualisation a été introduite pour permettre à d'anciennes apps de fonctionner même si elles écrivent dans des emplacements protégés (Program Files, HKLM, etc.). Dès qu'un manifest est détecté, la virtualisation est suspendue.
    Wow6432Node correspond à la ruche 32 bits sur des systèmes 64 bits. Les apps 32 bits sont redirigées de façon transparente sur cette clé.

  4. #4
    Membre habitué

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 294
    Points : 171
    Points
    171
    Billets dans le blog
    1
    Par défaut
    Merci à vous deux ! Les choses sont claires, maintenant.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 22/08/2014, 12h35
  2. [Débutant] Condition: "une touche du clavier est-elle enfoncée ?"
    Par clmoi90 dans le forum MATLAB
    Réponses: 4
    Dernier message: 10/05/2011, 12h07
  3. Une page en .php est elle référencée par google et consorts
    Par lonycc dans le forum Référencement
    Réponses: 8
    Dernier message: 25/11/2008, 15h31
  4. Réponses: 6
    Dernier message: 26/09/2008, 10h04
  5. une interpolation de forme est elle possible
    Par tetsuo chima dans le forum Flash
    Réponses: 3
    Dernier message: 07/10/2003, 16h31

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