Dostęp do rejestru za pomocą AutoLISP?

Zacznijmy od odczytania danych z rejestru. Załóżmy że chcemy odczytać wartość parametru „Path” z kluczu rejestru:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Msinfo„.

Główną funkcją AutoLISP do odczytu danych (wartości) z rejestru jest:

Wyjaśnijmy jej argumenty i działanie:

vl-registry-read – wywołanie funkcji

regkey – Jest to ciąg znaków (string) określający klucz rejestru.
Klucz powinien się składać klucza głównego („HKEY_LOCAL_MACHINE”, „HKEY_CURRENT_USER”, „HKEY_CLASSES_ROOT”, „HKEY_USERS” W naszym przypadku będzie to „HKEY_LOCAL_MACHINE„) oraz podklucza. W naszym przypadku będzie to „SOFTWARE\\Microsoft\\Shared Tools\\Msinfo„. Pamiętaj o podwójnym backslashu (\\), ponieważ pojedynczy backslash jest znakiem specjalnym w ciągach znaków LISP-a i wymaga 'escap-owania’.
value-name – nazwa parametru do odczytania (parametr jest również typu string),
w naszym przypadku to „Path
Podstawmy nasze wartości do funkcji:

(vl-registry-readHKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Shared Tools\\Msinfo” „Path„)

A teraz napiszmy prostą procedurę która odczytuje wartość z rejestru, albo zwraca „nil” w przypadku gdy nie udało się jej odczytać.
Otwieramy notatnik i tworzymy nowy plik z rozszerzeniem *.lsp, a następnie zapisujemy go (załóżmy z nazwą „Test.lsp”).
Kod będzie wyglądał następująco:

;; Definiujemy komendę CAD
(defun c:reg_read_data()
;; Załadujemy funkcji Visual LISP i COM
(vl-load-com)
;; tworzymy zmienną spath oraz przypisujemy jej wartość ścieżki do naszego klucza w rejestrze:
(setq spath „HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Shared Tools\\Msinfo
;; tworzymy zmienną valueName i dla naszej wartości w rejestrze:
(setq valueName „Path„)
;; Próbujemy odczytać dane
(setq registryValue (vl-registry-read spath valueName))
;; Sprawdzamy wynik i …
(if registryValue
;; jeśli udało się odczytać, wyświetlamy wartość
(alert (strcat „Odczytana wartość: ” registryValue))
;; jeśli się nie udało odczytać, wyświetlamy komunikat o błędzie
(alert (strcat „Nie udało się odczytać danych z rejestru :((( ” ))
)
(princ) ;; Koniec procedury
)

Teraz wczytujemy go z AutoCAD, dlatego wpisujemy w wierszu polecenia AutoCAD:
appload” w powstałym oknie klikamy „load” i wskazujemy nasz plik Test.lsp
Po wybraniu pliku AutoCAD potwierdzi że plik został poprawnie wczytany.

( Jeśli tak nie jest, to oznacza że kod zawiera błędy i nie może być poprawnie uruchomiony).
Teraz wpisujemy w wierszu polecenia AutoCAD naszą stworzoną komendę:
reg_read_data
I …. tadammm!
otrzymujemy powiadomienie:

Czyli nasz parametr został prawidłowo odczytany 🙂 Brawo my!
Trzeba pamiętać że dostęp do niektórych kluczy rejestru wymaga praw administratora (szczególnie klucz HKEY_LOCAL_MACHINE)

Zapis parametru do rejestru odbywa się analogicznie, tylko za pomocą funkcji:
(vl-registry-write regkey value-name regvalue)
gdzie:
regkey – klucz rejestru do zapisu
value-name – nazwa parametru
regvalue – wartość parametru

Spróbujmy teraz zapisać parametr „Info” z wartością „Sukces” do kluczu „HKEY_CURRENT_USER\Software\Vizorino
Jeśli taki klucz nie istnieje to funkcja stworzy go automatycznie.

Od razu trzeba powiedzieć, że rejestr Windows to nie najlepsze miejsce, gdzie możemy robić eksperymenty! Nieudane próby zapisu do rejestru mogą doprowadzić twój system operacyjny do krachu i konieczności przeinstalowania go ponownie!!! Bądź ostrożny, a najlepiej zrób to w maszynie wirtualnej! W każdym bądź razie nie ponosimy żadnej odpowiedzialności za konsekwencji Twojej nieodpowiedzialności 😉

A więc nasza procedura będzie wyglądać tak:

(defun c:reg_write_data( / regKey regParam regValue WriteResult )
;; Zaladowanie funkcji Visual LISP i COM – upewniamy sie, ze sa dostepne
(vl-load-com)
;; Przypisujemy wartości zmiennym (pamiętaj o podwójnym slash-owaniu)
(setq regKey „HKEY_CURRENT_USER\\Software\\Vizorino”)
(setq regParam „Info”)
(setq regValue „Sukces”)

;; Zapisanie wartości do rejestru
;; vl-registry-write przyjmuje: ścieżkę klucza, nazwę wartości, dane do zapisu

(setq WriteResult (vl-registry-write regKey regParam regValue))

;; Sprawdzenie wyniku zapisu i wyświetlenie komunikatu
(if WriteResult
;; Ten blok wykona się, jeśli zapis się powiódł (WriteResult nie jest nil)
(alert (strcat „Sukces! Prawidłowo zapisano wartość!!!”))

;; Ten blok wykona się, jeśli zapis się NIE powiódł (WriteResult jest nil)
(alert (strcat „Błąd zapisu! Nie udało się zapisać wartości „))

)
;; (princ) na końcu, aby zapobiec wyświetleniu „nil” w wierszu poleceń
(princ)
)

Wczytujemy nasz lisp do AutoCAD za pomocą polecenia „appload” oraz
uruchamiamy go wpisując polecenie: „reg_write_data” w wierszu poleceń AutoCAD

Dane zostały poprawnie zapisane!
Sprawdzamy:

Sukces! Można iść świętować! 🙂

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *