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 :

Impossible de lire clé de registre sous WIN10


Sujet :

Langage Delphi

  1. #1
    Membre confirmé
    Impossible de lire clé de registre sous WIN10
    Bonjour,

    Avec ce code je n'arrive pas à lire une clé de registre sous windows 10 et ca m'affiche le Showmessage du code ce n'est pas le cas sous XP et 7 :
    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
     
    Function ReadRegistryKey(RegistryRootKey: HKEY;KeyPath,KeyToRead:string):String;
    var
        Registry: TRegistry;
        str:string;
      begin
        Registry := TRegistry.Create(KEY_WRITE);
        try
          Registry.RootKey := RegistryRootKey;
           if not Registry.OpenKeyReadOnly(KeyPath) then showmessage('Impossible de lire clé '+KeyPath);
           str := Registry.ReadString(KeyToRead);
          result:=str;
          Registry.CloseKey;
        finally
          Registry.Free;
        end; // try..finally
      end;


    Et pour lire la clé je fais ceci pour lire la valeur de Init:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    ValeurCle:=ReadRegistryKey(HKEY_CURRENT_USER,'Software\MonProg\Settings','Init');


    Es-ce qu'il y a SVP, une autre manière de récupérer les clés de registre sous win10 ?

    J'ai D7 32 bits

    Merci !
    Le Savoir c'est le Pouvoir !
    S.Freud

  2. #2
    Membre émérite
    Bonjour,

    je pense qu'il manque un \ devant le nom de ta clef. Si ta clef existe cela devrait fonctionner. Par exemple avec :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
      ValeurCle:=ReadRegistryKey(HKEY_CURRENT_USER,'\Software\Embarcadero\FireDAC','FDHome');
      ShowMessage(ValeurCle) ;


    Cela renvoie le bon résultat sous D7 et Win10

    A+
    Charly

  3. #3
    Membre émérite
    PS : avec D7 j'aurai du prendre :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
      ValeurCle:=ReadRegistryKey(HKEY_CURRENT_USER,'\Software\Borland\ETM\7.0','EditorFilename');
      ShowMessage(ValeurCle) ;


    Qui va bien aussi

    A+
    Charly

  4. #4
    Membre émérite
    RePS : Ta clef est bien de type String ?

    A+
    Charly

  5. #5
    Membre confirmé
    Je pense pas que ca marcherait parce que c'est une affaire de de KEY_WOW64_64KEY comme dans ce post je dis ne pense pas si j'avais win10 j'aurais tester ta variante mais après maintes recherches epuisantes et sans résultats je fais comme SergioMaster dans ce post, d'ailleurs c'est le dernier sur lequel je suis tombé, alors j'abandonne la méthode de l'inscription dans le registre. D'ailleurs dans mes app j'ai commencé par supprimés ces lectures du reg et même virer la chose depuis innosetup c'est vraiment une corvée ce registre 64bit. Merci quand même.
    Le Savoir c'est le Pouvoir !
    S.Freud

  6. #6
    Membre confirmé
    J'ai pas vu ton post pendant que je composait le mien oui c'est du type String. Je souhaitais une solution qui marcherait à coup sûr mais réflexion faite je viens d'abandonné la méthode du registre parce que je n'ai pas de plateforme 64 bit ni de win10 pour tester. Merci quand même Charly910
    Le Savoir c'est le Pouvoir !
    S.Freud

  7. #7
    Rédacteur/Modérateur

    Il n'y a pas de redirection sous HKEY_CURRENT_USER.

    Citation Envoyé par freud Voir le message
    je n'ai pas de plateforme 64 bit ni de win10 pour tester.
    Donc comment tu sais que ça marche pas ?


    Soit la clé n'est pas valide, soit elle nécessite des autorisations spéciales. Pas de différence entre Win7 et 10.

  8. #8
    Membre confirmé
    Citation Envoyé par Andnotor
    Donc comment tu sais que ça marche pas ?
    J'ai trois utilisateurs sous win10 où ca n'a pas marché et un quatrieme où ca a marché sous 7
    Je suis sous XP 32 bit et ca a marché c'est la plateforme de dev. avec D7

    Chez les deux ca leur affiche un message du showmessage qui est dans le code
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    if not Registry.OpenKeyReadOnly(KeyPath) then showmessage('Impossible de lire clé '+KeyPath);


    chez l'autre ca lui affiche:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    Systeme error code:15100
    Le chargeur de ressources n'a pas trouver le fichier MUI


    Pour ce dernier j'avais conclu que c'etait toujours un problème du registre.
    J'ai dis que ca ne marche pas parce que suite à mes recherches notamment sur StackOverFlow les codes proposés sont différents de celui que j'ai posté et je ne pouvais me risquer à les utilisés fautes de plateformes comme je l'ai expliqué plus haut.
    Le Savoir c'est le Pouvoir !
    S.Freud

  9. #9
    Rédacteur/Modérateur

    Bonjour,
    Citation Envoyé par freud Voir le message
    je fais comme SergioMaster dans ce post
    me citer fait gonfler mon égo encore faut-il indiquer ce que je fais

    S'il s'agit de ne plus utiliser la base de registre (AMHA hyper mal fichue) pour stocker des données programmes je ne peux qu'approuver ce choix, une recommandation supplémentaire : stocker ces données dans le répertoire spécifique (appdata ou common_appdata) plus le nom de l'application.
    PS. pour obtenir les chemins spéciaux lire, par exemple, ceci
    (les versions "modernes" de delphi propose l'unité System.IOUtils et les fonctions de TPath)
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  10. #10
    Rédacteur/Modérateur

    A mon avis la clé n'existe pas, tout du moins pour cet utilisateur.

    Si tu écris dans HKCU à l'aide d'Inno Setup et que ton installateur nécessite des droits administrateurs pour s'exécuter, un utilisateur standard ne pourra pas lire cette clé puisqu'elle n'est pas inscrite dans sa ruche mais celle de l'admin. Tu auras exactement le même problème avec un fichier extrait sous %AppData%.

    Même sous XP, tu peux créer un utilisateur standard et essayer de lancer ton app. Je doute qu'elle tourne comme tu le penses.

    Dès lors, la question a poser à tes utilisateurs est s'ils se loguent sur un compte membre du groupe administrateur (dans quel cas ça va fonctionner) ou sur un compte limité.


    Cela dit, ton code est perfectible. Pourquoi lis-tu la valeur et ferme la clé si tu n'as pas pu ouvrir cette clé

  11. #11
    Membre émérite
    c'est aussi mon avis, il suffit de demander à tes utilisateurs de vérifier si ta clef existe (s'ils ont les droits de le faire ...)

    A+
    Charly

  12. #12
    Membre confirmé
    Bonjour tout le monde,

    Citation Envoyé par SergioMaster

    me citer fait gonfler mon égo encore faut-il indiquer ce que je fais
    Je pense pas que cela soit besoin de l'indiquer dans mon cas il s'agit des infos de l'install
    Mais attention faut pas trop se fier à l'ego
    Durant mes recherches, l'idée d'abandonner le registre à cause de l'UAC me trottait dans la tete et bien avant d'ailleurs mais j'etait indécis alors je suis tombé sur votre post et n'avait plus jus pour continuer et me suis décidé.
    Le registre ne m'appartient pas (surtout le 64bit) alors je ne touche pas à ce qui ne m'appartient pas bien qu'il simplifie les choses je reste avec les fichiers INI.

    Citation Envoyé par Andnotor

    Dès lors, la question a poser à tes utilisateurs est s'ils se loguent sur un compte membre du groupe administrateur (dans quel cas ça va fonctionner) ou sur un compte limité.
    Pour un utilisateur, l'install se déroule bien et l'app est executée en tant qu'administrateur. Mais, ce n'est pas possible d'aller demander aux gens de faire des tests après ca deviendra un autre type de relation alors vous me comprenez ?

    Citation Envoyé par Andnotor

    Cela dit, ton code est perfectible. Pourquoi lis-tu la valeur et ferme la clé si tu n'as pas pu ouvrir cette clé
    Ah oui c'est vrai j'avais oublier l'exit ou l'abort après le message si de ca dont tu veux parler merci.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if not Registry.OpenKeyReadOnly(KeyPath) then 
    Begin
     showmessage('Impossible de lire clé '+KeyPath);
     Abort;
    end;


    Merci pour le lien SergioMaster
    Merci à tout le monde pour votre aide.
    Le Savoir c'est le Pouvoir !
    S.Freud

###raw>template_hook.ano_emploi###