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 :

Décodage d'une date dans le registre


Sujet :

Langage Delphi

  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 011
    Points : 2 078
    Points
    2 078
    Par défaut Décodage d'une date dans le registre
    Bonjour,
    Je cherche à décoder dans le registre des valeurs de type REG_Binary qui correspondent à des dates
    (pour info les clés sont du genre HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles\{1D982609-2A7A-4321-91F2-2ECE4004EE6A}) values « DateCreated » ou « dateLastConnected ».

    Avec Regedit je lis par exemple :
    DateCreated REG_Binary « dd 07 01 00 06 00 0c 00 2c 00 38 00 »
    C’est a priori le 12/01/2013 17 :14 :26
    C’est WIndows 8.1 qui écrit ces clés.

    Dans Delphi ,
    • Avec Tregistry.readDateTime
    o ça déclenche une exception. Dans la doc XE : « Si l'entrée de registre ne contient pas de valeur date ou heure », une exception est déclenchée. . Des recherches Google indiquent que Tregidtry.readDateTime ne marcherait que si la valeur du registre été écrite avec Tregistry.WriteDateTime.

    • Avec Tregidtry.readBinary
    o je récupère bien « Dd 07 01 00 06 00 0c 00 2c 00 38 00 », mais a partir de la je ne sais pas convertir en Tdatetime ou une string de date lisible.

    PS : je ne pense pas que ce soit un problème de droits : pour ouvrir la clé je lance l’exécutable en mode administrateur et je vérifie que la clé est bien ouverte. Par ailleurs, dans la clé je récupère sans problème les valeurs Reg_SZ par exemple « Description » ou « ProfileName »

    Comment décoder, quel est le format utilisé par Windows ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 689
    Points : 13 118
    Points
    13 118
    Par défaut
    Le format n'est pas TDateTime (réel) mais TSystemTime (record de word). Peut être converti ensuite par SystemTimeToDateTime.

    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
    var
      ST :TSystemTime;
     
    begin
      with TRegistry.Create do
      begin
        RootKey := HKEY_LOCAL_MACHINE;
     
        if OpenKeyReadOnly('SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles\{GUID}') then
        begin
          ReadBinaryData('DateLastConnected', ST, SizeOf(ST));
          Label1.Caption := DateTimeToStr(SystemTimeToDateTime(ST));
        end;
     
        Free;
      end;
    end;

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 011
    Points : 2 078
    Points
    2 078
    Par défaut Décodage date dans registre
    Bonjour
    Un grand merci Andnotor ça marche
    Il y avait un moment que je galérai en essayant tout ce qui pouvait ressembler à un format date genre timestamp , date unix etc ..

    Cerises sur le gâteau :
    L'explication est simple et claire, le code est fourni : c'est presque trop !

    Au passage un merci à Shait et troll pour sa ligne magique que j'ai ajoutée à l'exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Access := KEY_READ or KEY_WOW64_64KEY;
    qu'il a récemment indiqué à un autre utilisateur. Je suis sous 8.1 64bits, sans elle, même en mode administrateur, la clé n'est pas ouverte.
    Bonne fin de week-end à tous .

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 689
    Points : 13 118
    Points
    13 118
    Par défaut
    Citation Envoyé par gaby277 Voir le message
    sans elle, même en mode administrateur, la clé n'est pas ouverte.
    D'où l'utilisation de OpenKeyReadOnly qui force KEY_READ
    KEY_WOW64_64KEY est pour lire une clé 64 bits depuis une application 32 bits.

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 011
    Points : 2 078
    Points
    2 078
    Par défaut Decodage date registre
    Bonjour,
    D'où l'utilisation de OpenKeyReadOnly qui force KEY_READ
    KEY_WOW64_64KEY est pour lire une clé 64 bits depuis une application 32 bits.
    J'utilise Delphi XE1 starter donc applications uniquement 32 bits.
    Je viens de refaire l'essai pour confirmer que la ligne est nécessaire.

    Par contre effectivement le fonctionnement des applis 32 bits sous OS 64 bits et le mode administrateur c'est deux choses différentes et la précision était utile alors que mon message était approximatif dans la mesure ou il semblait dire que ça "augmentait le mode administrateur".

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

Discussions similaires

  1. [XL-2010] Stocker une date dans la base de registre
    Par Daejung dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/02/2014, 20h58
  2. Comment fixer une date dans un champ !
    Par LATHIOS dans le forum Access
    Réponses: 8
    Dernier message: 17/06/2005, 19h44
  3. insérer une date dans une table mssql
    Par ericmart dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 29/01/2004, 10h37
  4. test la valeur d'une date dans une requete
    Par TuxP dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/01/2004, 14h53
  5. Lire une valeur dans le registre
    Par John.s dans le forum C
    Réponses: 2
    Dernier message: 26/11/2003, 19h55

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