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

Composants VCL Delphi Discussion :

TRegistry qui ne fonctionne pas à tout les coups


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 213
    Points : 109
    Points
    109
    Par défaut TRegistry qui ne fonctionne pas à tout les coups
    Bonjour,

    voici mon petit problème du jour.
    Lorsque je lance mon programme sur mon pc, tout va bien. Je suis admin local.
    Mais lorsque je lance le même programme sur la machine d'un utilisateur, cette étape de code ne fonctionne pas! J'ai essayé avec un utilisateur standard non admin et en admin avec le même résultat.

    Point le plus surprenant, si j'ouvre la registry pour vérifier que la clé existe bien, après ca fonctionne.
    Je redémarre le pc et ca ne fonctionne de nouveau plus tant que je n'ai pas ouvert la registry! A moins d'avoir loupé une étape, c'est le seul moyen que j'ai trouvé de pouvoir faire fonctionner le programme.
    L'un de vous aurait il un idée du pourquoi?

    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
     
    function GetOcOpInfo(Software, Info : String):String;
    var
      InformationBack : TRegistry;
    begin
      Result := '';
     
      InformationBack := TRegistry.Create(KEY_EXECUTE);
      try
        InformationBack.RootKey := HKEY_LOCAL_MACHINE;
        if not InformationBack.KeyExists('SOFTWARE\\') then
        else if InformationBack.KeyExists('SOFTWARE\\EasternGraphics\\Install\\' + Software + '\\') then
        begin
                InformationBack.OpenKeyReadOnly('SOFTWARE\\EasternGraphics\\Install\\' + Software + '\\');
          Result := InformationBack.ReadString(Info);
        end;
     
      finally
        InformationBack.CloseKey;
        InformationBack.Free;
      end;
    Merci

  2. #2
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 670
    Points : 7 038
    Points
    7 038
    Par défaut
    Il faut précisier l'accès en lecture seule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Reg.Access := KEY_EXECUTE;

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 213
    Points : 109
    Points
    109
    Par défaut
    Citation Envoyé par Lung Voir le message
    Il faut précisier l'accès en lecture seule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Reg.Access := KEY_EXECUTE;
    Merci mais je viens d'essayer et cela ne fonctionne pas

    J'avais déjà renseigné le KEY_EXECUTE dans le create, il faut impérativement le renseigner dans l'Access encore par après?

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut
    Citation Envoyé par davels Voir le message
    ... il faut impérativement le renseigner dans l'Access encore par après?
    Non pas du tout, dans le Create c'est suffisant.


    Et comme ça ?
    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
    function GetOcOpInfo(Software, Info: string): string;
    var
      Key: string;
    begin
      Result := '';
      Key := '\SOFTWARE\EasternGraphics\Install\' + Software;
     
      with TRegistry.Create(KEY_EXECUTE) do
      try
        RootKey := HKEY_LOCAL_MACHINE;
        if KeyExists(Key) then
        begin
          OpenKey(Key, False);
          Result := ReadString(Info);
        end;
      finally
        CloseKey;
        Free;
      end;
    end;
    J'ai l'impression que tes \\ mettent le bazar.
    Et puis ce:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if not Condition then
    else if ...
    C'est pas courant comme écriture.

    @+ Claudius

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 573
    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 573
    Points : 25 206
    Points
    25 206
    Par défaut
    les \\ ça sent la recopie d'un code C++ en Delphi !
    C'est surprenant mais Windows l'accepte aussi pour les répertoires, des fois trop de souplesse ce n'est pas une bonne idée !

    J'ai un vieil exe qui ressemble un regedit, je n'ai pas spécifié de niveau d'acces, je dois être en KEY_ALL_ACCESS.

    Le premier niveau de clé est obtenu par RegEnumKey (en 2000, je ne savais pas que OpenKeyReadOnly acceptait '' pour indiquer la racine )

    Ensuite, j'utilise un TRegistry.KeyExists, TRegistry.OpenKeyReadOnly TRegistry.GetValueNames pour alimenter le TListView des valeurs, cela fonctionne encore très bien aujourd'hui sur XP (exe compilé en 2003 avec D7 probablement)

    ton code est extrément basique, utilises-tu vista ou seven ?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 213
    Points : 109
    Points
    109
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    les \\ ça sent la recopie d'un code C++ en Delphi !
    C'est surprenant mais Windows l'accepte aussi pour les répertoires, des fois trop de souplesse ce n'est pas une bonne idée !

    J'ai un vieil exe qui ressemble un regedit, je n'ai pas spécifié de niveau d'acces, je dois être en KEY_ALL_ACCESS.

    Le premier niveau de clé est obtenu par RegEnumKey (en 2000, je ne savais pas que OpenKeyReadOnly acceptait '' pour indiquer la racine )

    Ensuite, j'utilise un TRegistry.KeyExists, TRegistry.OpenKeyReadOnly TRegistry.GetValueNames pour alimenter le TListView des valeurs, cela fonctionne encore très bien aujourd'hui sur XP (exe compilé en 2003 avec D7 probablement)

    ton code est extrément basique, utilises-tu vista ou seven ?
    Re! Merci pour votre aide!

    En effet, c'est du code copié depuis cette source : http://docwiki.embarcadero.com/CodeE...istry_(Delphi)
    Cela dit, ce n'est pas du bête copié/collé, je le comprends.
    Et d'aussi loin que je me souvienne, j'ai toujouts mis les \\ pour les TRegistry, je vais essayer de suite si ca fonctionne avec juste \ (car j'avais laissé le problème sur le côté)

  7. #7
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    houlalala
    que de code pour lire une valeur dans le registre...

    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
     
    function GetOcOpInfo(aSoftware {key}, aInfo {value}: String):String;
    begin
      Result := '';
     
      with TRegistry.Create do
      try
        RootKey := HKEY_LOCAL_MACHINE;
        if OpenKey('SOFTWARE\EasternGraphics\Install\' + aSoftware, false) then
          Result := ReadString(aInfo);
        closeKey; 
      finally
        Free;
      end;
    end;

Discussions similaires

  1. Remove item qui ne fonctionne pas à tout les coups ?
    Par Elharion dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/02/2012, 18h26
  2. Réponses: 2
    Dernier message: 16/03/2010, 09h49
  3. Réponses: 4
    Dernier message: 04/11/2009, 22h31
  4. _POST qui ne fonctionne pas tout le temps
    Par johnson95 dans le forum Langage
    Réponses: 8
    Dernier message: 24/04/2008, 09h45
  5. Réponses: 10
    Dernier message: 13/03/2007, 11h38

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