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 :

Coup de main sur TRegistry et REG_MULTI_SZ (et autres types non définis)


Sujet :

Composants VCL Delphi

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut Surcharge de TRegistry pour REG_MULTI_SZ et autres types non définis
    Salut tout le monde !

    J'ai besoin d'un 'tit coup de main pour accéder aux valeurs de la base de registre dont les types ne sont pas définis dans Registry.pas (voir QualityCentral pour les détails).

    L'explication semble simple mais je ne sais pas faire, et comme j'ai un D7 perso, je n'ai pas les sources pour aller modifier directement dans Registry.pas...
    En gros, il faut changer le TRegDataTypes et ajouter deux fonctions :
    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
    {To show the mapping of enumeration entries to API types,
     here are the updated type and the conversion functions
     for the missing types:}
     
       TRegDataType = (rdUnknown, rdNone, rdString, rdExpandString, rdBinary,
                       rdInteger, rdLittleEndianInteger, rdBigEndianInteger,
                       rdLink, rdMultiString, rdResourceList,
                       rdFullResourceDescriptor, rdResourceRequirementsList,
                       rdInt64, rdLittleEndianInt64);
     
    function RegDataToDataType(Value: TRegDataType): Integer;
    begin
      case Value of
        rdNone: Result := REG_NONE;
        rdString: Result := REG_SZ;
        rdExpandString: Result := REG_EXPAND_SZ;
        rdBinary: Result := REG_BINARY;
        rdInteger: Result := REG_DWORD;
        rdLittleEndianInteger: Result := REG_DWORD_LITTLE_ENDIAN;
        rdBigEndianInteger: Result := REG_DWORD_BIG_ENDIAN;
        rdLink: Result := REG_LINK;
        rdMultiString: Result := REG_MULTI_SZ;
        rdResourceList: Result := REG_RESOURCE_LIST;
        rdFullResourceDescriptor: Result := REG_FULL_RESOURCE_DESCRIPTOR;
        rdResourceRequirementsList: Result := REG_RESOURCE_REQUIREMENTS_LIST;
        rdInt64: Result := REG_QWORD;
        rdLittleEndianInt64: Result := REG_QWORD_LITTLE_ENDIAN;
      else
        Result := REG_NONE;
      end;
    end;
     
    function DataTypeToRegData(Value: Integer): TRegDataType;
    begin
      if Value = REG_NONE then Result := rdNone
      else if Value = REG_SZ then Result := rdString
      else if Value = REG_EXPAND_SZ then Result := rdExpandString
      else if Value = REG_BINARY then Result := rdBinary
      else if Value = REG_DWORD then Result := rdInteger
      else if Value = REG_DWORD_LITTLE_ENDIAN then Result := rdLittleEndianInteger
      else if Value = REG_DWORD_BIG_ENDIAN then Result := rdBigEndianInteger
      else if Value = REG_LINK then Result := rdLink
      else if Value = REG_MULTI_SZ then Result := rdMultiString
      else if Value = REG_RESOURCE_LIST then Result := rdResourceList
      else if Value = REG_FULL_RESOURCE_DESCRIPTOR then Result := rdFullResourceDescriptor
      else if Value = REG_RESOURCE_REQUIREMENTS_LIST then Result := rdResourceRequirementsList
      else if Value = REG_QWORD then Result := rdInt64
      else if Value = REG_QWORD_LITTLE_ENDIAN then Result := rdLittleEndianInt64
      else Result := rdUnknown;
    end;
    Ah, il faut également rajouter deux trucs inconnus de mon D7 (et trouvés chez koders) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const
      REG_QWORD                      = 11; // 64-bit number
      {$EXTERNALSYM REG_QWORD}
      REG_QWORD_LITTLE_ENDIAN        = 11; // 64-bit number (same as REG_QWORD)
      {$EXTERNALSYM REG_QWORD_LITTLE_ENDIAN}
    Comment puis-je m'y prendre (me suis toujours embrouillé avec les override, overload et consorts, désolé) ?
    Merci d'avance,
    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

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Ce n'est pas suffisant d'y ajouter la déclaration de type. Il faut aussi en traiter les données correctement.

    Par exemple pour lire un REG_MULTI_SZ j'avais écris ceci il y a un moment :
    http://nono40.developpez.com/sources/source0023/
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Salut nono40,

    et merci de ta réponse.
    Il est vrai que si je voulais juste lire des REG_MULTI_SZ, ton exemple serait parfait ; cependant, je cite l'article d'origine :
    Registry.pas lists the following TRegDataType:
    rdUnknown
    rdString
    rdExpandString
    rdInteger
    rdBinary
    But there are more types that are available and that are not accessible through TRegistry (...)
    Ok, c'est vrai que mon titre n'est ("n'était" -- je viens de le modifier) pas explicite puisque je n'y parle que de REG_MULTI_SZ (je ne voulais pas l'alourdir), alors qu'en fait, j'aimerais bien pouvoir récupérer les autres types, non déclarés dans Registry.pas et que l'article cite.
    L'idée ça serait de pouvoir faire ça :
    I've created a class that inherits from TRegistry (...)
    et là, je suis sec !
    J'avais pensé partir d'un vieux (D3 !) Registry.pas que je possède, mais cette cochonnerie refuse de compiler (trucs pas définis, ) donc je suis coincé...

    Une autre idée ?
    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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Bonsoir.

    Le monsieur il disait "I've created a class that inherits from TRegistry" donc j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    unit MyRegistry;
     
    interface
     
    uses
      Windows, Registry;
     
    type
      TMyRegistry = class(TRegistry);
    ...
    dessous j'ai rajouté son TRegDataType et deux constantes trouvées chez koders,
    et enfin j'ai collé ses deux fonctions sous implementation en rajoutant "overload;" au bout de la ligne.

    C'est bien comme ça qu'il faut faire ?

    Ensuite, j'ai mis MyRegistry dans les uses de mon Unit1 mais il a fallu que je rajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      TRegDataInfo = record
        RegData: TRegDataType;
        DataSize: Integer;
      end;
    dans mon unité MyRegistry sinon pas de compil... Je ne sais pas pourquoi (messages d'erreur à la noix)...

    Il me reste un point que je n'arrive pas à passer (j'abrège la procédure pour faire simple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.DisplayValues(R: TMyRegistry);
    var
      i    : integer;
      info : TRegDataInfo;
    begin
      for i := 0 to ListBox2.Count - 1 do
      begin
        if R.GetDataInfo(ListBox2.Items.Strings[i], info) then ...
    Le compilateur coince sur cette dernière ligne avec le curseur après la parenthèse fermante avec
    le message classique "Les types des paramètres VAR originaux et formels doivent être identiques".

    Moi je veux bien, mais si je tape R.Ge la complétion me propose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetDataInfo(const ValueName: String; var Value: TRegDataInfo): Boolean;
    C'est quoi qui coince, étant entendu que je n'ai pas touché à cette fonction ?
    Et je précise que cette ligne compile très bien si j'utilise l'unité Registry d'origine.
    Merci,
    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
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par Nono40 Voir le message
    Par exemple pour lire un REG_MULTI_SZ j'avais écris ceci il y a un moment :
    http://nono40.developpez.com/sources/source0023/
    Méfiance, Nono40, car si quelqu'un réussit à implémenter ce sur quoi je galère sans avancer, il lui faudra également modifier une fonction dans Registry.pas pour que ton exemple fonctionne :
    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
    function TRegistry.ReadBinaryData(const Name: string; var Buffer; BufSize: Integer): Integer;
    var
      RegData: TRegDataType;
      Info: TRegDataInfo;
    begin
      if GetDataInfo(Name, Info) then
      begin
        Result := Info.DataSize;
        RegData := Info.RegData;
    //    if ((RegData = rdBinary) or (RegData = rdUnknown)) and (Result <= BufSize) then
        if ((RegData = rdBinary) or (RegData = rdUnknown) or (RegData = rdMultiString)) and (Result <= BufSize) then
          GetData(Name, @Buffer, Result, RegData)
        else ReadError(Name);
      end else
        Result := 0;
    end;
    Sinon, je suis toujours bloqué... Personne ici n'est capable de voir ce qui cloche dans mon post précédent ?
    'Tite info complémentaire : le monsieur dont je cause a écrit Spybot-S&D et autres trucs du même tonneau : ça doit pas être un codeur du dimanche, àmha.
    --
    jp
    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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    (Je clique sur « Ajouter une réponse » mais j'ai l'impression de faire un monologue... Bah...)

    Bon,
    j'ai trouvé ça dans un Registry.pas (daté de 1998) déniché sur le ouebbe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      public
        ...
        function GetDataInfo(const ValueName: string; var Value: TRegDataInfo): Boolean;
    Pourquoi mon compilo me dit-il
    Les types des paramètres VAR originaux et formels doivent être identiques
    sur cette fichue ligne de code (curseur après la parenthèse fermante)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //                   string                 TRegDataInfo
    if R.GetDataInfo(ListBox2.Items.Strings[i], info) then ...
    qui compile bien quand je suis en mode « original » de ce Registry.pas (qui doit venir d'un D6, vu l'âge) ?

    Tout ce que je fais est de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function RegDataToDataType(Value: TRegDataType): Integer;
    begin
      case Value of
        rdString: Result := REG_SZ;
        rdExpandString: Result := REG_EXPAND_SZ;
        rdInteger: Result := REG_DWORD;
        rdBinary: Result := REG_BINARY;
      else
        Result := REG_NONE;
      end;
    end;
    par
    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 RegDataToDataType(Value: TRegDataType): Integer;
    begin
      case Value of
        rdNone: Result := REG_NONE;
        rdString: Result := REG_SZ;
        rdExpandString: Result := REG_EXPAND_SZ;
        rdBinary: Result := REG_BINARY;
        rdInteger: Result := REG_DWORD;
        rdLittleEndianInteger: Result := REG_DWORD_LITTLE_ENDIAN;
        rdBigEndianInteger: Result := REG_DWORD_BIG_ENDIAN;
        rdLink: Result := REG_LINK;
        rdMultiString: Result := REG_MULTI_SZ;
        rdResourceList: Result := REG_RESOURCE_LIST;
        rdFullResourceDescriptor: Result := REG_FULL_RESOURCE_DESCRIPTOR;
        rdResourceRequirementsList: Result := REG_RESOURCE_REQUIREMENTS_LIST;
        rdInt64: Result := REG_QWORD;
        rdLittleEndianInt64: Result := REG_QWORD_LITTLE_ENDIAN;
      else
        Result := REG_NONE;
      end;
    end;
    et les fonctions inverses (que je mets pas, pour alléger) et de remplacer le TRegDataType par un autre plus fourni.

    Bon, dans le uses, dans les var, les choses qui vont bien et voilà, quoi.

    Alors, une idée ?, les spécialistes de l'héritage, de la surcharge, des composants, etc.
    Merci,
    --
    jp
    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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut Dommage qu'il n'y ait pas un bouton « Résolu à moitié »
    Quand j'ai vu que ça compilait avec ce Registry.pas « normal », j'ai inversé les commentaires du TRegDataType et ça a compilé.

    Je me suis dit (je me parle, des fois) « continuons donc ! » et j'ai inversé les commentaires des deux fonctions, ie j'ai revalidé les fonctions du monsieur de Spybot et ça a compilé encore !

    J'ai rajouté la ligne modifiée dont j'ai parlé à Nono40 et ça compile toujours,
    et ça marche bien !

    Go figure...

    Parce que si j'utilise mon unité MyRegistry, qui définit au début
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
      TMyRegistry = class(TRegistry);
    et que je rajoute la « ligne à Nono40 » et donc tout ç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
    function TRegistry.ReadBinaryData(const Name: string; var Buffer; BufSize: Integer): Integer;  overload;
    var
      RegData: TRegDataType;
      Info: TRegDataInfo;
    begin
      if GetDataInfo(Name, Info) then
      begin
        Result := Info.DataSize;
        RegData := Info.RegData;
    //    if ((RegData = rdBinary) or (RegData = rdUnknown)) and (Result <= BufSize) then
        if ((RegData = rdBinary) or (RegData = rdUnknown) or (RegData = rdMultiString)) and (Result <= BufSize) then
          GetData(Name, @Buffer, Result, RegData)
        else ReadError(Name);
      end else
        Result := 0;
    end;
    hé ben là, « La fonction attend un type de résultat » avant ReadBinaryData ; et si j'enlève overload;, c'est pareil...
    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

Discussions similaires

  1. un coup de main sur un bout de code
    Par namstou3 dans le forum Flex
    Réponses: 2
    Dernier message: 01/07/2008, 06h27
  2. coup de main sur XpressMP
    Par rihanna dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 21/01/2008, 14h01
  3. un pitit coup de main sur une fermeture auto
    Par MORPHEUS50 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 25/04/2007, 18h41

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