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

Autres IDE Pascal Discussion :

Lecture d'une valeur du registre Windows [Virtual Pascal]


Sujet :

Autres IDE Pascal

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut Lecture d'une valeur du registre Windows
    Bonjour !

    J'ai voulu essayer d'utiliser l'unité RegEdit de Paul TOTH avec Virtual Pascal.

    L'unité se compile (avec la directive {$H+}), mais elle ne fonctionne pas. (Pour information, avec Free Pascal elle se compile et fonctionne correctement.)

    J'ai fait un petit programme indépendant avec le code de la fonction ReadRegString pour essayer de comprendre ce qui se passe. Auriez-vous une idée ?

    Une erreur à la compilation est plus facile à corriger. Là, je ne sais pas trop de quel côté chercher.

    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
    program TestReadRegString;
     
    { Code extrait de l'unité RegEdit de Paul TOTH :
      http://tothpaul.free.fr/sources.php?tools.units
      
      Essai d'adaptation pour Virtual Pascal.
    }
     
    {$PMTYPE VIO}
    {$H+}
    {$USE32+}
     
    uses
      Windows;
     
    var
      key: HKEY;
      path: string;
      value, default: string;
     
      handle: HKEY;
      regtype: integer;
      datasize: integer;
      result: string;
     
    begin
      key := HKEY_CURRENT_USER;
      //path := 'Software\Embarcadero\BDS\9.0\Closed Projects';
      path := 'Volatile Environment';
      //value := 'File_0';
      value := 'USERNAME';
     
      default := 'Cha'#140'ne introuvable.';
     
      result := default;
      if RegOpenKeyEx(key, pChar(path), 0, KEY_ALL_ACCESS, handle) = ERROR_SUCCESS then
      begin
        if RegQueryValueEx(handle, pChar(value), nil, @regtype, nil, @datasize) = ERROR_SUCCESS then
        begin
          SetLength(result, datasize);
          RegQueryValueEx(handle, pChar(value), nil, @regtype, PByte(pChar(result)), @datasize);
          SetLength(result, datasize - 1);
        end else
          WriteLn('2');
        RegCloseKey(handle);
      end else
        WriteLn('1');
     
      WriteLn(result);
      Write('Appuyez sur la touche Entr'#130'e... ');
      ReadLn;
    end.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1
    Chaîne introuvable
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 415
    Points
    59 415
    Billets dans le blog
    2
    Par défaut


    L'unité compile, en effet, mais pas ton programme de test. L'éditeur de liens retourne une erreur 117 sur un symbole externe non défini "SysCtrlSleep". Je n'arrive pas à résoudre cette erreur (il y a bien une procédure SysCtrlSleep déclarée external dans l'unité System).

    Je vais peut-être (sans doute) dire une bêtise mais es-tu bien sûr que le programme ne fonctionne pas ? Car, sur mon système, je n'ai pas de clé "USERNAME" dans la section \\HKCU\Volatile Environment. Mais bon, c'est un vieux Windows 2000 sur une vieille bécane.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Merci Jean-Luc pour ta réponse !

    Je suis étonné de ce que tu dis, que le programme que j'ai posté ne compile pas, car chez moi il compile (je viens encore de vérifier).

    Je suis sûr aussi que la valeur que j'avais prise comme exemple existe bien sur ma machine, car quand je compile mon programme avec Free Pascal, j'obtiens le bon résultat (à savoir mon nom d'utilisateur).

    J'ai légèrement modifié mon programme, en remplaçant la valeur par une autre qui doit exister aussi sur ta machine (enfin je crois).

    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
    program TestReadRegString;
     
    { Code extrait de l'unité RegEdit de Paul TOTH :
      http://tothpaul.free.fr/sources.php?tools.units
     
      Essai d'adaptation pour Virtual Pascal.
    }
     
    {$IFDEF VPASCAL}
    {$PMTYPE VIO}
    {$H+}
    {$ELSE}
    {$APPTYPE CONSOLE}
    {$ENDIF}
     
    uses
      Windows;
     
    var
      key: HKEY;
      path: string;
      value, default: string;
     
      handle: HKEY;
      regtype: integer;
      datasize: integer;
      result: string;
     
    begin
      key := HKEY_CURRENT_USER;
      //path := 'Software\Embarcadero\BDS\9.0\Closed Projects';
      //path := 'Volatile Environment';
      path := 'Environment';
     
      //value := 'File_0';
      //value := 'USERNAME';
      value := 'TMP'; // ou 'TEMP'
     
      default := 'Cha'#140'ne introuvable.';
     
      result := default;
      if RegOpenKeyEx(key, pChar(path), 0, KEY_ALL_ACCESS, handle) = ERROR_SUCCESS then
      begin
        if RegQueryValueEx(handle, pChar(value), nil, @regtype, nil, @datasize) = ERROR_SUCCESS then
        begin
          SetLength(result, datasize);
          RegQueryValueEx(handle, pChar(value), nil, @regtype, PByte(pChar(result)), @datasize);
          SetLength(result, datasize - 1);
        end else
          WriteLn('2');
        RegCloseKey(handle);
      end else
        WriteLn('1');
     
      WriteLn(result);
      Write('Appuyez sur la touche Entr'#130'e... ');
      ReadLn;
    end.
    Là encore, avec Free Pascal, le programme compile et donne le bon résultat ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    %USERPROFILE%\AppData\Local\Temp
    Appuyez sur la touche Entrée...
    avec Virtual Pascal, le programme compile mais ne trouve pas la valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1
    Chaîne introuvable.
    Appuyez sur la touche Entrée...
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 125
    Points
    15 125
    Par défaut
    Salut,
    Citation Envoyé par Alcatîz Voir le message
    Car, sur mon système, je n'ai pas de clé "USERNAME" dans la section \\HKCU\Volatile Environment. Mais bon, c'est un vieux Windows 2000 sur une vieille bécane.
    Cette clé est présente dans une VM XP SP2.

    @Roland :
    Pourquoi ne pas traiter RegOpenKeyEx comme une fonction (ce qu'elle est, d'ailleurs), et donc gérer son retour pour savoir ce qui se passe ?
    Infos ici

    Désolé de ne pas pouvoir aider plus, mais je n'ai pas de Lazarus installé dans la VM XP, et je ne suis pas sûr du résultat de RegOpenKeyEx dans ma machine Linux
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Pourquoi ne pas traiter RegOpenKeyEx comme une fonction (ce qu'elle est, d'ailleurs), et donc gérer son retour pour savoir ce qui se passe ?
    Infos ici
    Merci, Jipété, pour l'idée et pour le lien ! Je n'ai pas résolu le problème, mais j'ai au moins appris quelque chose, à savoir l'existence et l'usage de la fonction FormatMessage.

    Pour l'usage de la fonction en Pascal, je me suis aidé de cet exemple. Voici donc mon petit programme avec un message d'erreur. Ce qui est curieux, c'est le message que j'obtiens : "L'opération a réussi."

    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
    program TestReadRegString3;
     
    { Code extrait de l'unité RegEdit de Paul TOTH :
      http://tothpaul.free.fr/sources.php?tools.units
     
      Essai d'adaptation pour Virtual Pascal.
    }
     
    {$IFDEF VPASCAL}
    {$PMTYPE VIO}
    {$H+}
    {$ELSE}
    {$APPTYPE CONSOLE}
    {$ENDIF}
     
    uses
      Windows;
     
    var
      key: HKEY;
      path: string;
      value, default: string;
     
      handle: HKEY;
      regtype: integer;
      datasize: integer;
      result: string;
     
      chaine: array[0..511]of char;
    { http://www.developpez.net/forums/d1034628/autres-langages/pascal/lazarus/obtenir-message-d-erreur-d-shellexecute/#post5764683
    }
     
    begin
      key := HKEY_CURRENT_USER;
      //path := 'Software\Embarcadero\BDS\9.0\Closed Projects';
      //path := 'Volatile Environment';
      path := 'Environment';
     
      //value := 'File_0';
      //value := 'USERNAME';
      value := 'TMP'; // ou 'TEMP'
     
      default := 'Cha'#140'ne introuvable.';
     
      result := default;
      if RegOpenKeyEx(key, pChar(path), 0, KEY_ALL_ACCESS, handle) = ERROR_SUCCESS then
      begin
        if RegQueryValueEx(handle, pChar(value), nil, @regtype, nil, @datasize) = ERROR_SUCCESS then
        begin
          SetLength(result, datasize);
          RegQueryValueEx(handle, pChar(value), nil, @regtype, PByte(pChar(result)), @datasize);
          SetLength(result, datasize - 1);
        end else
        begin
          FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, GetLastError, 0, @chaine, SizeOf(chaine), nil);
          WriteLn('2');
        end;
        RegCloseKey(handle);
      end else
      begin
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, GetLastError, 0, @chaine, SizeOf(chaine), nil);
        WriteLn('1');
      end;
     
      WriteLn(result);
      if result = default then
      begin
        CharToOem(chaine, chaine);
        WriteLn(chaine);
      end;
     
      Write('Appuyez sur la touche Entr'#130'e... ');
      ReadLn;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    J'ai trouvé ! En remplaçant KEY_ALL_ACCESS par KEY_READ, ça marche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if RegOpenKeyEx(key, pChar(path), 0, KEY_READ, handle) = ERROR_SUCCESS then
    Je vais voir maintenant si j'arrive à utiliser les autres fonctions de l'unité.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 125
    Points
    15 125
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    J'ai trouvé ! En remplaçant KEY_ALL_ACCESS par KEY_READ, ça marche.
    Pb de droits ?

    Citation Envoyé par Roland Chastain Voir le message
    (...) Ce qui est curieux, c'est le message que j'obtiens : "L'opération a réussi."

    Perso j'aurais fait plus basique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    intRetour := RegOpenKeyEx(...);
    ShowMessage(IntToStr(intRetour)); // et aller voir le résultat dans Winerror.h
    Des fois que le "GetLastError" se réfère à l'appel de FormatMessage...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  8. #8
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Pb de droits ?
    Peut-être, mais j'avais essayé d'exécuter "en tant qu'administrateur", et ça ne changeait pas le résultat. (Alors que, compilé avec Free Pascal, le programme produisait le résultat attendu, même en l'exécutant simplement.)

    Citation Envoyé par Jipété Voir le message
    Perso j'aurais fait plus basique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    intRetour := RegOpenKeyEx(...);
    ShowMessage(IntToStr(intRetour)); // et aller voir le résultat dans Winerror.h
    Des fois que le "GetLastError" se réfère à l'appel de FormatMessage...
    Ah oui, tiens, je n'y avais pas pensé. Ça expliquerait peut-être le message d'erreur surprenant. Mais logiquement, GetLastError est appelée avant FormatMessage, non ? Quoiqu'il en soit, je vais essayer aussi ton code.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  9. #9
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    La même modification (KEY_ALL_ACCESS remplacé par KEY_READ) permet de rendre opérationnelle la fonction ReadRegInteger. (Je rappelle que je parle toujours de Virtual Pascal. Avec Free Pascal, la modification n'est pas nécessaire. Pourquoi le comportement du programme varie suivant le compilateur utilisé, c'est ce que je n'ai pas compris.)

    En revanche, je n'ai pas réussi à utiliser les autres fonctions de l'unité (avec aucun des deux compilateurs). Le code se compile, mais il ne produit aucun effet : par exemple, je n'ai pas réussi à écrire une nouvelle valeur dans le registre (même en exécutant le programme en tant qu'administrateur). Ce qui est étrange, c'est que, bien que l'opération échoue, la fonction WriteRegString renvoie quand même la valeur TRUE. C'est bien compliqué tout ça...

    Je marque la discussion comme résolue, puisque j'ai réussi à lire le registre.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  10. #10
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    En revanche, je n'ai pas réussi à utiliser les autres fonctions de l'unité (avec aucun des deux compilateurs). Le code se compile, mais il ne produit aucun effet : par exemple, je n'ai pas réussi à écrire une nouvelle valeur dans le registre (même en exécutant le programme en tant qu'administrateur).
    Il y a du nouveau ! Après avoir lu une discussion sur le forum Delphi, je me suis aperçu que, contrairement à ce que j'avais affirmé, mon programme écrivait bel et bien la valeur dans le registre, mais pas à l'endroit que j'attendais.

    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
    program TestRegEdit3;
    {$PMTYPE VIO}
     
    uses
      RegEdit;
     
    const
      HKEY_LOCAL_MACHINE = $80000002;
     
    begin
      WriteLn(WriteRegString(HKEY_LOCAL_MACHINE, 'Software\MySoft', 'Author', 'Paul TOTH'));
     
      // Sous Windows 8.1, la clé suivante est créée :
      // HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MySoft
     
      Write('Appuyez sur la touche Entr'#130'e... ');
      ReadLn;
    end.

    Bref, il faut que je reprenne les choses depuis le début. Manifestement, les problèmes que j'ai signalés venaient d'un manque de connaissance de ma part, relativement à l'utilisation du registre.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

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

Discussions similaires

  1. Récupération de la valeur d'une clé du registre windows XP.
    Par Espionnite dans le forum Programmation et administration système
    Réponses: 3
    Dernier message: 01/09/2008, 11h21
  2. Réponses: 9
    Dernier message: 12/08/2008, 16h50
  3. lecture d'une valeur dans un tableau
    Par canary dans le forum Collection et Stream
    Réponses: 14
    Dernier message: 03/01/2008, 17h36
  4. Réponses: 3
    Dernier message: 24/04/2007, 15h54
  5. syntaxe "UPDATE" (lecture d'une valeur avec jointu
    Par mrblue1978 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/01/2006, 14h38

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