Accéder a la Base De Registre sans API ni Lib

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Accéder a la Base De Registre sans API ni Lib

Message par cage »

Bonjour,

Je profite de l'article d'Ar-S DRIVE ICON CHANGER pour donner une solution sans API ni Lib pour lire des clés de la BDR (Base De Registre)
Utilisez l'application d'Ar-S pour changer les icônes des disques internes ou partitions de votre PC et testez le code suivant:

Code : Tout sélectionner

EnableExplicit

Global erreur$

Procedure.s regQuery(quoi$)
  Protected flags, texte$
  Protected dc$ = Chr(34)
  Protected Key$ = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DriveIcons\"
  ClearClipboard()
  erreur$ = #Null$
  flags = #PB_Program_Wait|#PB_Program_Hide
  RunProgram("cmd.exe", "/c reg.exe query "+dc$+Key$+quoi$+dc$+" 2>&1|clip", "", Flags)
  texte$ = GetClipboardText() ;: Debug texte$
  ClearClipboard()
  If FindString(texte$,"Erreur",1,#PB_String_NoCase)
    erreur$ = ReplaceString(texte$, #CRLF$, #Null$)
  EndIf
  ProcedureReturn texte$
EndProcedure

Procedure getDriveIcons()
  Protected count, enum, index
  Protected line$, result$, Disque$, Lettre$
  
  Structure DriveIcons
    Drive.s
    Icon.s
  EndStructure

  NewMap Drive.DriveIcons()
  
  For enum = 0 To 25 ; 26 letters A->Z  code 65 to 90
    Lettre$ = Chr(65 + enum)
    Disque$ = Lettre$ +":\"
    If FileSize(Disque$) = -2
      Drive(Lettre$)\Drive = Disque$ ; ou Lettre$ au choix
      result$ = regQuery(Lettre$)
      count = CountString(result$, #CRLF$)
      If count
        For index = 1 To count
          line$ = StringField(result$, index, #CRLF$)
          If FindString(line$,"DefaultIcon",1,#PB_String_NoCase)
            result$ = regQuery(Lettre$+"\DefaultIcon")
            Drive()\Icon = Trim(StringField(result$,2,"REG_SZ"))
          EndIf
        Next
        If Drive()\Icon = #Null$
          If erreur$ = #Null$
            Drive()\Icon = "Aucune icône définie"
          Else
            Drive()\Icon = erreur$
          EndIf
        EndIf
      EndIf
    EndIf
  Next
  
  ForEach Drive()
    Debug "Disque: "+ Drive()\Drive
    Debug ">Icône: " + Drive()\Icon
    Debug #Null$
  Next
EndProcedure

getDriveIcons()
Cette méthode permet sans API ni Lib d'accéder a n'importe quelle clé de la BDR
Cela peut intéresser ceux qui n'ont qu'une version démo de PB
reg.exe est un utilitaire disponible sur toutes les versions Windows de XP a 10
L'aide s'obtient par reg /? dans une Invite de commandes

Code : Tout sélectionner

C:\>reg.exe /?

REG Opération [Liste de paramètres]

  Opération  [ QUERY   | ADD    | DELETE  | COPY    |
               SAVE    | LOAD   | UNLOAD  | RESTORE |
               COMPARE | EXPORT | IMPORT  | FLAGS ]

Code de retour : (sauf pour REG COMPARE)

  0 : réussite
  1 : échec

Pour obtenir de l’aide sur un type d’opération particulier :

  REG Opération /?

Exemples :

  REG QUERY /?
  REG ADD /?
  REG DELETE /?
  REG COPY /?
  REG SAVE /?
  REG RESTORE /?
  REG LOAD /?
  REG UNLOAD /?
  REG COMPARE /?
  REG EXPORT /?
  REG IMPORT /?
  REG FLAGS /?

C:\>
Je vous laisse deviner ce qu'il est possible de faire avec reg.exe et PB
Une autre solution est d'utiliser vbs a partir de PB pour arriver a ses fins.
Une autre fois certainement.
CAGE
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr