Aller au contenu

Proposition d'un pense-bête pour les accès au registre Windows.


DenisHen

Messages recommandés

Bonjour à la communauté
Ayant passé pas mal de temps à comprendre et tester les différents accès à la base de registre depuis un LiSP, je vous propose mon petit « pense-bête ».
Bien entendu, je vous invite à nous faire part de vos remarques et observations, car je compte un peu là-dessus 😉.

La base de registre est structurée comme une « arborescence » (indiquée en une ligne sous le menu de l'éditeur de registre) :
Exemple : HKEY_CURRENT_USER\SOFTWARE\Autodesk\AutoCAD\R24.2
"Ordinateur" est volontairement omis.

Remarque :  il peut être dangereux d'utiliser des clefs de registre de logiciels existants, préférer créer vos propres clefs.

LISP-Labasederegistre-Structuregenerale.png.b0c781322499719550d976f97df79e06.png

Il me semble que l’accès à toutes les clefs est limité, seules les racines HKEY_USERS et HKEY_LOCAL_MACHINE sont accessibles.

Liste des « répertoires » (contenant des clefs) d’un chemin.

_$ (append (vl-registry-descendents "HKEY_CURRENT_USER\\SOFTWARE\\Autodesk\\AutoCAD\\R24.2"))
("ACAD-6101:40C")

Liste des « clefs » (contenants une valeur) d’un chemin.

_$ (append (vl-registry-descendents "HKEY_CURRENT_USER\\SOFTWARE\\Autodesk\\AutoCAD\\R24.2" ""))
("LastLaunchedLanguage" "LastLaunchedProduct" "CurVer")

Lecture d’une valeur de clef.

_$ (vl-registry-read "HKEY_CURRENT_USER\\SOFTWARE\\Autodesk\\AutoCAD\\R24.2" "CurVer")
"ACAD-6101:40C"

Création et/ou écriture d’une valeur de clef.

(vl-registry-write "HKEY_CURRENT_USER\\SOFTWARE\\Autodesk\\AutoCAD\\R24.2" "CadXP" "DenisH")

LISP-Labasederegistre-Vl-Write.png.a08be011e76e01a9565520e25f622d0e.png

La valeur « DenisH » a été attribuée à la clef « CadXP », si la clef n’existe pas, elle sera créée.

Suppression d’une clef.

_$ (vl-registry-delete "HKEY_CURRENT_USER\\SOFTWARE\\Autodesk\\AutoCAD\\R24.2" "CadXP")
T

La réponse est « T » si elle a bien été supprimée ou nil si elle n’a pas été trouvée.

 

Ce petit pense-bête n'est qu'une proposition, et bien entendu, une explication succincte, à nous de l'alimenter...

Je m'en ferais un PDF que je partagerais volontiers.

Bien à toi la communauté.

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Voir les fonctions

Jusqu'à AutoCAD 2012 on utilisait vlax-product-key indifféremment pour HKCU et HKLM, depuis AutoCAD 2012, il y a deux fonctions différenciées au cas ou le chemin dans HKCU soit différent de celui dans HKLM.

_$ (strcat "HKEY_CURRENT_USER\\" (vlax-user-product-key))
"HKEY_CURRENT_USER\\Software\\Autodesk\\AutoCAD\\R24.3\\ACAD-7101:40C"

 

_$ (strcat "HKEY_LOCAL_MACHINE\\" (vlax-machine-product-key))
"HKEY_LOCAL_MACHINE\\Software\\Autodesk\\AutoCAD\\R24.3\\ACAD-7101:40C"

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Je vois que tu crée une clé dans le registre d'Autocad.

Il me semble que ce n'est pas conseillé (trop facile de faire une erreur).

Pour les clés perso, rien ne t'empêche de créer une application, au même niveau qu'Autodesk,

et d'y mettre toutes les clé que tu veux sans danger pour l'intégrité de ton logiciel préféré.

De plus, c'est un chemin qui ne dépend pas de la version d'Autocad, ni du profile.

Bonne exploration

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @Fraid.

Oui, créer une clef dans le registre AutoCAD est "dangereux", je suis entièrement d'accord.
Mais c'était pour l'exemple, pour que tout le monde puisse avoir la même chose (à par la version, comme tu le soulignes).
Car si j'avais donné l'exemple de mes clefs "perso", l'exemple aurait peut-être été moins efficace.

Je vais aussi faire un petit exemple avec "user", au cas où...

Merci pour ta remarque judicieuse...

 

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

On peut écrire dans le registre AutoCAD, mais comme toujours en programmation, il faut le faire prudemment.

Par exemple, on peut depuis AutoCAD 2012, créer des variables système personnalisées en écrivant des clés dans la base de registre (En LISP on ne peut écrire que dans HKCU, donc les variables seront définies 'par utilisateur).

Traduction de l'aide .NET pour le format des clés de variables système:

[HKEY_CURRENT_USER\{ProductRegistryRoot}\Variables\{Nom de la variable}]
@="{valeur par défaut}" : Requis, sera converti en PrimaryDataType 
"PrimaryType"=dword:{Type principal} : Requis
"SecondaryType"=dword:{Type secondaire} : Optionnel 
"TypeFlags"=dword:{Drapeau de type} : Optionnel 
"StorageType"=dword:{Type de stockage} : Requis 
"Owner"="{Nom de l'application|exe}" : Optionnel 
"Range"="{minimum},{maximum}" : Optionnel, s'applique aux type principaux RTREAL, RTANG, RTSHORT et RTLONG

"PrimaryType"
RTREAL = 5001		Nombre réel
RTSHORT = 5003		Nombre entier (16 bits)
RTSTR = 5005		Chaîne de caractère
RTLONG = 5010		Nombre entier (32 bits)

"SecondaryType"
Angle = 5		La variable représente une valeur angulaire.
Area = 3		La variable représente un valeur d'aire. Valable uniquement lorsque le type principal est RTREAL
Boolean = 1		La variable est un booléen. Valable uniquement lorsque le type principal est RTSHORT
Distance = 4		La variable représente une valeur de distance. Valable uniquement lorsque le type principal est RTREAL
Last = 6		Marque le dernier élément de l'énumération.
None = 0		Aucun type de données secondaires n'est spécifié.
SymbolName = 2		La variable est un nom de symbole RealDWG. Valable uniquement lorsque le type principal est RTSTR
UnitlessReal = 6	La variable représente une valeur réelle sans unité.

"StorageType"
PerSession = 1		Etendue de l'application, ne persiste pas.
PerUser = 2		Etendue de l'application, persiste par utilisateur.
PerProfile = 3		Etendue de l'application, persiste par profil AutoCAD.
PerDatabase = 4		Etendue du document, persiste dans le dessin.

"TypeFlags"
Chatty = 8		La variable envoie des notifications lorsqu'elle prend la même valeur que la précédente. Les variables ignorent normalement les tentatives de définir la même valeur deux fois de suite.
DotMeansEmpty = 2	Le caractère . doit être interprété comme une chaîne vide. Valable uniquement lorsque le type principal est RTSTR
None = 0		Aucun indicateur de type n'est spécifié.
NoUndo = 4		La variable n'enregistre pas l'annulation.
SpacesAllowed = 1	Les espaces sont autorisés dans les valeurs des variables. Valable uniquement lorsque le type principal est RTSTR

Un exemple pour créer une variable système persistante dans le document, nommée "SOME_INTEGER", de type entier compris entre 0 et 15.

((lambda (varName / rootKey)
   (setq rootKey (strcat "HKEY_CURRENT_USER\\"
			 (vlax-user-product-key)
			 "\\Variables\\"
		 )
   )
   (foreach p '(("" "0")		; valeur par défaut
		("PrimaryType" 5003)	; nombre entier
		("StorageType" 4)	; persiste dans le document
		("LowerBound" 0)	; valeur minimale
		("UpperBound" 15)	; valeur maximale
	       )
     (apply 'vl-registry-write (cons (strcat rootKey varName) p))
   )
 )
  "SOME_INTEGER"			; nom de la variable
)

La variable nouvellement créée est accessible avec les fonctions LISP setvar et getvar et avec la commande MODIFVAR.

Commande: (getvar 'some_integer)
0

Commande: MODIFVAR
Entrez le nom de la variable ou [?]: some_integer

Entrez une nouvelle valeur pour SOME_INTEGER <0>: 42

Nécessite un entier entre 0 et 15.

Entrez une nouvelle valeur pour SOME_INTEGER <0>: 7

Commande: (getvar 'some_integer)
7

Commande: (setvar 'some_integer -1)
; erreur: paramètre de la variable AutoCAD rejeté: SOME_INTEGER -1

Commande: (getvar 'some_integer)
7

 

  • Upvote 2

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Un autre exemple avec une variable nommée "SOME_ANGLE", persistante par utilisateur, de type nombre réel (valeur angulaire)

((lambda (varName / rootKey)
   (setq rootKey (strcat "HKEY_CURRENT_USER\\"
			 (vlax-user-product-key)
			 "\\Variables\\"
		 )
   )
   (foreach p '(("" "0.0")		; valeur par défaut
		("PrimaryType" 5001)	; nombre réel
		("SecondaryType" 5)	; valeur d'angle
		("StorageType" 2)	; persiste par utilisateur
	       )
     (apply 'vl-registry-write (cons (strcat rootKey varName) p))
   )
 )
  "SOME_ANGLE"				; nom de la variable
)

Avec le type valeur angulaire, MODIFVAR utilise l'unité angulaire courante (getvar/setvar utilisent toujours les radians).

Commande: (getvar 'some_angle)
0.0

Commande: (setvar 'some_angle (/ pi 6))
0.523599

Commande: MODIFVAR
Entrez le nom de la variable ou [?]: some_angle

Entrez une nouvelle valeur pour SOME_ANGLE <30>: 180

Commande: (getvar 'some_angle)
3.14159

 

  • Like 1

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Un grand merci @(gile) pour ces explications.
Mais du coup, je me pose une petite question : quelle est la différence avec (setenv et (getenv ?

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Il y a 2 heures, DenisHen a dit :

Mais du coup, je me pose une petite question : quelle est la différence avec (setenv et (getenv ?

Tu n'as pas lu attentivement, les variables système permettent un contrôle des valeurs bien plus précis.

Avec getenv / setenv :

  • la valeur est uniquement de type chaînes de caractère sans espace
  • la valeur est enregistrée identiquement pour tous les utilisateurs, tous les profils, tous les dessins

Avec les variables systèmes :

  • la valeur peut être une chaîne de caractère avec ou sans espaces ou un nombre entier 16 bits, entier 32 bits ou réel avec une limite inférieure et/ou supérieure et ce nombre peut représenter un angle, une distance, une aire ou une valeur booléenne.
  • la valeur peut ne pas être enregistrée ou bien être enregistrée par utilisateur, par profil ou par dessin
     

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Ok, merci, je n'avais pas compris la portée de (setenv et (getenv.

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité