TRegistry
Thao tác với registry
Thao tác với registry
Delphi sử dụng lớp TRegistry trong unit System.Win.Registry để thao tác với registry.
Còn registry là gì thì bạn vui lòng tìm trên google nhé. Bài viết này chỉ khi bạn thực sự cần làm việc với registry, nếu không thì thôi.
Bạn cũng nên khai báo thêm unit Winapi.Windows để sử dụng được 1 số hằng đã được định nghĩa sẵn cho registry.
Registry có thể được xem và chỉnh sửa bởi regedit (RegEdit - Registry Editor chứa không phải ReGeDit :D). Bấm tổ hợp phím Windows + R và gõ regedit, nhấn Enter.
Registry gồm 5 khóa gốc (root key) sau:
HKEY_CLASSES_ROOT: Chứa các thông tin đăng kí tệp
HKEY_CURRENT_USER: Chứa các thông tin cài đặt của người dùng hiện tại
HKEY_LOCAL_MACHINE: Chứa thông tin hệ thống, dùng cho tất cả người dùng
HKEY_USERS: Không biết nhưng không quan trọng
HKEY_CURRENT_CONFIG: Như trên
Tên các rootkey có thể được viết tắt, như HKCR, HKCU, HKLM, ...
Mỗi key (kể cả root key) đều có thể chứa các key khác hoặc value. Bất kì key nào cũng có một value với tên (default) kiểu string (REG_SZ).
Một số key trong HKEY_LOCAL_MACHINE yêu cầu quyền admin để có thể truy cập đến được.
Để thao tác với registry, cần thông qua 5 bước:
Tạo đối tượng registry
Đặt rootkey
Mở và đóng các key con
Đọc và ghi dữ liệu
Phá hủy đối tượng registry
Delphi sử dụng lớp TRegistry để thao tác với registry.
var
r: TRegistry;
begin
r := TRegistry.Create;
try
r.RootKey := HKEY_CURRENT_USER;
...
finally
r.Free;
end;
end;
Về cơ bản là vậy. Sau đây, chúng ta sẽ xét tiếp những thao tác khác.
Để thao tác đến các key con, delphi sử dụng method OpenKey với 2 tham số:
Tham số 1 là đường dẫn đến key (path). Đường dẫn này không bao gồm tên key gốc.
Tham số 2 là một biến boolean, chỉ ra rằng có thể tạo thêm key mới hay không. Nếu chỉ mở key để đọc dữ liệu thì đặt là False, còn muốn ghi hoặc tạo dữ liệu mới thì đặt là True.
Có thể mở cùng lúc nhiều key lồng nhau bằng dấu \ phân cách.
Ví dụ sau là mở key HKEY_CURRENT_USER\Control Panel\Desktop với hàm OpenKey để đọc dữ liệu.
r.RootKey := HKEY_CURRENT_USER;
r.OpenKey('Control Panel\Desktop', false);
...
Hàm OpenKey trả về một giá trị boolean, là True nếu mở được key, là False nếu không mở được (key không tồn tại hoặc bị cấm mở). Bạn có thể sử dụng như trên (Dạng thủ tục) hoặc sử dụng như bên dưới (như hàm) để kiểm tra.
if r.OpenKey('Control Panel\Desktop', false) = false then
writeln('Khong mo duoc key');
Bây giờ, nếu bạn muốn chuyển sang key khác, ví dụ như HKEY_CURRENT_USER\Software, bạn sẽ làm sao. Tất nhiên bạn sẽ không thể dùng OpenKey được vì đang ở key khác, OpenKey chỉ mở được các key tiếp theo thôi. Vì vậy, bạn cần dùng thủ tục CloseKey để đóng key hiện tại lại, và dùng thêm OpenKey để mở key cần mở.
r.CloseKey;
r.OpenKey('Software');
Khi gọi CloseKey, key hiện tại sẽ trở về root key.
Path (đường dẫn) là đường dẫn đến key hiện tại. Ở ví dụ trên, path là Control Panel\Desktop và Software.
Để lấy key hiện tại, bạn sử dụng method CurrentPath.
writeln('Key hien tai la ', r.CurrentPath);
Có hai đối tượng cần kiểm tra sự tồn tại là key và value. Delphi cung cấp 2 method trong class TRegistry là KeyExists và ValueExists. Hai hàm này trả về một kiểu boolean, True nếu tồn tại, False nếu không tồn tại.
Lưu ý: Hai hàm này chỉ kiểm tra trong phạm vi key hiện tại.
if r.KeyExists('ABC') = true then
writeln('Key co ton tai')
else
writeln('Key khong ton tai');
if r.ValueExists('') = true then
writeln('Value co ton tai')
else
writeln('Value khong ton tai');
Khá đơn giản đúng không. Chú ý đến phần ValueExists ở trên, ValueName mang giá trị rỗng, điều đó chỉ ra rằng Value được chỉ đến là value (default).
Sử dụng hàm CreateKey để tạo key mới bên trong key hiện tại. Hàm này trả về boolean, True nếu tạo được, ngược lại False nếu tạo bị lỗi.
if r.CreateKey('ABCD') = false then
writeln('Khong the tao key');
Để ghi value vào key, lớp TRegistry cung cấp nhiều method với tên là Write... tùy vào kiểu dữ liệu cần ghi vào.
Ví dụ như WriteInteger để ghi số nguyên, WriteFloat để ghi số thực, WriteString để ghi chuỗi, ...
r.WriteString('Name', 'Tong Hoang Vu');
r.WriteInteger('Age', 18);
Với tham số đầu là tên value (nếu ghi vào value (default) thì tên value đặt là rỗng). Tham số thứ hai là giá trị tùy thuộc vào kiểu dữ liệu.
Chú ý: Ghi vào registry nếu đã có value trùng tên thì sẽ bị ghi đè. Dữ liệu trước đó bị mất.
Đi cùng với các thủ tục ghi là các hàm đọc dữ liệu từ registry. Hàm nhận tham số là tên value và trả về giá trị thuộc kiểu dữ liệu cần đọc.
Ví dụ, để đọc value Name và Age đã ghi ở trên vào biến, chúng ta làm như sau
var
MyName: string;
MyAge: Integer;
begin
...
MyName := r.ReadString('MyName');
MyAge := r.ReadInteger('MyAge');
end;
Chú ý: Cần kiểm tra sự tồn tại của value trước khi đọc dữ liệu, nếu không sẽ bị lỗi.
Dùng hàm DeleteKey để xóa key và DeleteValue để xóa value. Nếu xóa được, hàm trả về True, ngược lại False nếu xóa không được.
r.DeleteValue('MyAge');
r.DeleteKey('DSSN3EW');
Chú ý: Cẩn thận khi xóa, xóa nhầm key hay value của hệ thống sẽ làm hỏng win.
Còn có các hàm, thủ tục tiện ích khác trong class TRegistry, bạn tự tìm hiểu thêm nhé.