Hướng dẫn xử lý Registry trong VB6
Một chút về Registry
Bình thường Registry gồm có 5 khóa cơ sở đó là
Code:
1) HKEY_CLASSES_ROOT Thông tin hệ điều hành
2) HKEY_CURRENT_CONFIG Thông tin cấu hình hiện tại của máy tính
3) HKEY_LOCAL_MACHINE Thông tin các chương trình cho mọi người dùng
4) HKEY_CURRENT_USER Thông tin các chương trình cho người dùng hiện tại
5) HKEY_USERS Thông tin cho tất cả người dùng
Mỗi khóa cơ sở chứa các khóa con, mỗi khóa con lại chứa các khóa con với
lớp thấp hơn. Vì vậy nên một khóa bất kỳ trong registry có thể là khóa
con của khóa này nhưng cũng có thể là khóa cha của khóa kia.
Trong một khóa có thể có một hay nhiều giá trị (String Value). Giá trị
(Default) là giá trị luôn có trong một khóa. Mỗi giá trị đó có mỗi dữ
liệu riêng tương ứng với kiểu dữ liệu của nó, đây là phần quan trọng
nhất của registry . Trong registry có nhiều kiểu dữ liệu, phổ biến là.
Code:
1) REG_BINARY Một dãy bit thông tin
2) REG_DWORD Một số nguyên 32 Bit
3) REG_SZ Một chuổi Unicode
4) REG_MULTI_SZ Nhiều chuổi Unicode
Visual Basic đã cung cấp 4 hàm để xử lý Registry
Code:
1. GetAllSettings (appname, section)
Chức năng: lấy tất cả các thông tin của appname trong registry.
Ví dụ lấy các thông tin trong khóa Startup của Myapp
Code:
MySettings = GetAllSettings("MyApp", "Startup")
Code:
2. GetSetting (appname, section, key [, default])
Chức năng, lấy thông tin được lưu trong key, thuộc khóa section của
appname, giá trị default (có thể bỏ qua) là giá trị trả về nếu thông tin
muốn lấy về không có trong registry
Ví dụ
Code:
MySettings = GetSetting(“MyApp", “Startup","Left", "25")
3. SaveSetting appname, section, key, setting
Chức năng: Lưu thông tin trong registry
Ví dụ
Code:
SaveSetting "MyApp", "Startup", "Left", 50
4. DeleteSetting appname, section [, key]
Chức năng, xóa khóa section trong appname
Ví dụ xóa thông tin của MyApp trong khóa Startup
Code:
DeleteSetting "MyApp", "Startup"
Thực chất thì các giá trị registry được lưu trong khóa
HKEY_CURRENT_USER\Software\VB and VBA Program Settings. Còn nếu muốn làm
việc trên các khóa khác thì ta phải dùng một số hàm API để xử lý. Chú ý
tất cả các hằng, các biến kiểu, các hàm dưới đây bạn phải thêm từ khóa
là Private ở phía trước nếu muốn dùng trong Form, và Private hoặc là
Public nếu bạn dùng trong một Module. Và trong một số ví dụ tôi sẻ bỏ
qua những phần khai báo chúng .
Giới thiệu vài hằng số thông dụng trong API khi xử lý registry
Code:
1) Các khóa cơ sở của registry
• HKEY_CLASSES_ROOT = &H80000000
• HKEY_CURRENT_CONFIG = &H80000005
• HKEY_LOCAL_MACHINE = &H80000002
• HKEY_CURRENT_USER = &H80000001
• HKEY_USERS = &H80000003
2) Các kiểu truy xuất registry
Code:
• KEY_ALL_ACCESS = &HF003F ‘Mọi kiểu truy xuất
• KEY_CREATE_LINK = &H20 ‘ Quyền tạo liên kết ký hiệu
• KEY_CREATE_SUB_KEY = &H4 ‘Quyền tạo khóa con
• KEY_ENUMERATE_SUB_KEYS = &H8 ‘Quyền liệt kê khóa con
• KEY_EXECUTE = &H20019 ‘Quyền đọc
• KEY_NOTIFY = &H10
• KEY_QUERY_VALUE = &H1
• KEY_READ = &H20019 ‘Quyền đọc
• KEY_SET_VALUE = &H2 ‘Quyền đặt giá trị
• KEY_WRITE = &H20006 ‘Quyền viết dữ liệu
3) Các kiểu giá trị trong registry
Code:
• REG_BINARY = 3 ‘Một chuổi nhị phân
• REG_DWORD = 4 ‘ Một số nguyên 32 bit
• REG_DWORD_BIG_ENDIAN = 5 ‘Số nguyên 32 bit
• REG_DWORD_LITTLE_ENDIAN = 4 ‘Số nguyên 32 bit
• REG_EXPAND_SZ = 2 ‘Một chuổi kết thúc bởi Null
• REG_LINK = 6 ‘Liên kết Unicode
• REG_MULTI_SZ = 7 ‘ Nhiều chuổi kết hợp bởi kt Null
• REG_NONE = 0 ‘ Không rỏ kiểu
• REG_SZ=1 ‘ Một chuổi
• REG_RESOURCE_LIST = 8 ‘ Danh sách tài nguyên
II. Biến kiểu
Code:
1) Kiểu SECURITY_ATTRIBUTES
Type SECURITY_ATTRIBUTES
nLength As Long ‘Chiều dài của chuổi bảo mật
lpSecurityDescriptor As Long ‘ Chuổi bảo mật
bInheritHandle As Long ‘ hanle
End Type
2) Kiểu FILETIME
Code:
Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
III. Các hàm cần dùng khi xử lý Registry
1) Hàm RegOpenKeyEx
Khai báo
Code:
Declare Function RegOpenKeyEx Lib “advapi32.dll” Alias “RegOpenKeyExA (ByVal hKey as long,ByVal lpSubKey as string,ByVal ulOptions As long,Byval Samdesired As long,phkResult As long) As long
Hàm có nhiệm vụ mở một khóa trong registry, nếu thành công, hàm sẻ trả
về giá trị là 0, đồng thời biến phkResult sẻ mang giá trị hanle của khóa
được mở. Nếu có lỗi xãy ra, có thể là do khóa registry không tồn tại
hoặc tồn tại nhưng bị cấm truy cập thì hàm trả về mã lỗi khác 0.
Các tham số
• hKey
Chỉ đến khóa chính, là một trong các khóa chính ở mục I (1)
• lpSubKey
Là tên khóa cần mở.
• ulOption
Không cần thiết, có thể lập thành 0
• samdesired
Khai báo kiểu truy cập, là một hoặc kết hợp nhiều giá trị trong các giá trị ở mục I (2)
• phkResult
Là biến nhận hanle của khóa registry nếu khóa được mở thành công.
2) Hàm RegCreateKey
Khai báo
Code:
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Tương tự hàm RegOpenKeyEx nhưng khác ở chổ nếu khóa chưa tồn tại thì hàm sẻ tạo ra nó.
Các tham số
• hKey
Chỉ đến khóa chính, là một trong các khóa chính ở mục I (1)
• lpSubKey
Là tên khóa cần tạo
• phkResult
Biến nhận hanle của khóa được tạo hoặc được mở
3) Hàm RegCreateKeyEx
Khai báo
Code:
Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, phkResult As Long, lpdwDisposition As Long) As Long
Tương tự hàm RegCreateKey nhưng khác chút là có thêm một số thiết lập là
• Reserved
Thiết lập là 0
• lpClass
Tên lớp hoặc đối tượng của khóa, có thể đặt là chuổi rổng (“”)
• dwOption
Là 0 nếu muốn lưu lâu dài trong registry, là 1 nếu chỉ muốn lưu tạm thời, sẻ bị mất khi Window Shutdown.
• samdesired
Khai báo kiểu truy cập, là một hoặc kết hợp nhiều giá trị trong các giá trị ở mục I (2)
• lpSecurityAttributes
Thiết lập đặc tính bảo mật cho khóa được tạo ra.
• lpdwDisposition
Biến nhận kết quả là 1 nếu khóa chưa có và được tạo mới, là 2 nếu khóa đã tồn tại và mở ra.
4) Hàm RegCloseKey
Khai báo
Code:
Declare Function RegCloseKey Lib "advapi32.dll" Alias "RegCloseKey" (ByVal hKey As Long) As Long
Hàm có nhiệm vụ đóng lại khóa sau khi đã được mở bởi hàm trên. Giá trị
trả về là 0 nếu thành công hoặc là một mã lỗi khác 0 nếu có lỗi xảy ra.
Tham số hKey là hanle của khóa cần đóng. Tương ứng với tham số phkResult trong hai hàm trên.
Ví dụ
a) Mở khóa HKEY_CURRENT_USER\Software\VBClub Soft. Sau đó đóng khóa lại.
Code:
Dim retval As Long ‘Nhận giá trị trả về của hàm
Dim hkey As Long ‘ Nhận Hanle của khóa
Private Sub Form_Load()
retval = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\VBClub Soft", 0, KEY_ALL_ACCESS, hkey)
If retval <> 0 Then
MsgBox "Khoa chua co !", vbCritical, "Error"
Else
MsgBox "Khoa da co va vua duoc mo !", vbInformation, "Infomation"
End If
retval = RegCloseKey(hkey)
End Sub
b) Mở khóa HKEY_CURRENT_USER\Software\VBClub Soft. Nếu khóa chưa có thì tạo mới. Sau đó đóng khóa lại.
Code:
Dim retval As Long ‘nhan giá trị tra ve
Dim hkey As Long ‘Nhan hanle cua khoa
Dim keynew As Long ‘ Xem xem khoa da co hay chua
Dim SA As SECURITY_ATTRIBUTES ‘Khong co y nghia
Private Sub Form_Load()
retval = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\VBClub Soft", 0, "", 0, KEY_ALL_ACCESS, SA, hkey, keynew)
If retval <> 0 Then
MsgBox "Loi khi tao khoa !", vbCritical, "Error"
Else
If keynew = 1 Then
MsgBox "Khoa da duoc tao moi !", vbInformation, "Infomation"
Else
MsgBox "Khoa da ton tai", vbInformation, "Infomation"
End If
End If
retval = RegCloseKey(hkey)
End Sub
5) Hàm RegDeleteValue
Khai báo
Code:
Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
Hàm xóa chuổi giá trị trong registry. Giá trị trả về sẻ là 0 nếu thành
công và trả về mã lỗi khác 0 nếu thất bại. Với Windows hiện hành, hàm
đều thực hiện thành công nếu trong khóa còn có các khóa con. Chú ý là
trước khi xóa một giá trị trong key thì ta phảI mở Key đó ra trước đã.
Tham số
• Hkey
Là hanle của khóa chưa khóa cần xóa
• lpValueName
Tên giá trị bị xóa
Ví dụ
Xóa chuổi giá trị “num” trong khóa HKEY_CURRENT_USER\Software\VBClub Soft
Code:
Dim retval As Long
Dim hKey As Long
Private Sub Form_Load()
retval = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\VBClub Soft", 0, KEY_ALL_ACCESS, hKey)
retval = RegDeleteValue(hKey, "num")
If retval = 0 Then
MsgBox "Da xoa gia tri thanh cong", vbInformation, "Xoa"
Else
MsgBox "Loi khi xoa khoa", vbCritical, "Error"
End If
retval = RegCloseKey(hKey)
End Sub
6) Hàm RegDeleteKey
Khai báo
Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
Hàm xóa key trong registry. Giá trị trả về sẻ là 0 nếu thành công và trả về mã lỗi khác 0 nếu thất bại.
Tham số
• Hkey
Là một trong các khóa chính ở mục I(1)
• lpSubKey
Tên khóa bị xóa
Ví dụ xóa khóa HKEY_CURRENT_USER\Software\VBClub Soft\me
Dim retval As Long
Private Sub Form_Load()
retval = RegDeleteKey(HKEY_CURRENT_USER, "Software\VBClub Soft\me")
If retval = 0 Then
MsgBox "Da xoa gia tri thanh cong", vbInformation, "Xoa"
Else
MsgBox "Loi khi xoa khoa", vbCritical, "Error"
End If
retval = RegCloseKey(hKey)
End Sub
7) Hàm RegEnumKey
Khai báo
Code:
Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long
Hàm lấy một khóa con của một khóa. Khóa chứa khóa con gọi là khóa cha.
Nếu thành công, hàm trả về giá trị là 0, nếu có lỗi xảy ra, hàm trả về
mã lỗi khác 0. Vì cứ mỗi lần gọi nó lại xác định một khóa con nên ta có
thể liệt kê tất cả khóa con của một khóa cha bằng vòng lặp.
Các tham số
• Hkey
Hanle của khóa cha, phảI được mở trước.
• dwIndex
Số thứ tự của khóa con trong số các khóa cha sẻ được lấy ra. Chú ý rẳng
trong khóa cha có nhiều khóa con thì các khóa con sẻ được sắp xếp theo
tên từ A đến Z. Và dwIndex hợp lệ phảI có giá trị từ 0 đến số khóa con –
1.
• lpName
Một chuổi để chứa tên của khóa con. Chú ý trước khi dùng nó, bạn phảI khởi tạo cho nó, có thể dùng hàm space()
• cbname
Ghi giá trị chính là chiều dài của tên khóa con. Rất quan trọng khi phảI chỉnh lại chiều dài của chuổi lpName.
Ví dụ: Liệt kê tất cả các khóa con của khóa HKEY_CURRENT_USER\Software
Thêm một command vào form.
Code:
Option Explicit
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long
Private Const HKEY_CURRENT_USER = &H80000001
Private Const KEY_ALL_ACCESS = &HF003F
Dim retval As Long
Dim hKey As Long
Dim namekey As String ‘Ten khoa con
Dim lenname As Long ‘ Ghi chieu dai cua khoa con
Dim index As Long ‘ So thu thu cua khoa con
Private Sub Command1_Click()
Me.Cls ‘ Xoa nhung gi trong form
namekey = Space(255) ‘ Khoi tao bien namekey
lenname = 255
index = 0
retval = RegOpenKeyEx(HKEY_CURRENT_USER, "Software", 0, KEY_ALL_ACCESS, hKey)
Do While retval = 0
retval = RegEnumKey(hKey, index, namekey, lenname)
If retval = 0 Then Me.Print Left(namekey, lenname) ‘In namekey
index = index + 1
Loop
MsgBox "Khoa co tat ca " & index -1 & " khoa con", vbInformation, "Thong tin"
retval = RegCloseKey(hKey)
End Sub
Hàm RegEnumKeyEx
Khai báo
Code:
Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, lpcbName As Long, ByVal lpReserved As Long, ByVal lpClass As String, lpcbClass As Long, lpftLastWriteTime As FILETIME) As Long
Tương tự hàm RegEnumKey, nhưng nó có điểm khác là thêm các tham số sau:
• lpReserved
Không có ý nghĩa, bạn khai báo ByVal 0
• lpClass
Chuổi chứa tên khóa con, tương tự như tham số lpName. Phải khởi tạo trước khi sử dụng.
• lpcbClass
Kích thước của lpClass
• lpftLastWriteTime
Chứa thời gian ghi, chỉnh sửa khóa cuối cùng.
9) Hàm RegEnumValue
Khai báo
Code:
Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Byte, lpcbData As Long) As Long
Hàm đọc một thông tin trong registry . Trong một khóa có nhiều giá trị
thì các chúng đó được sắp xếp có thứ tự và hàm sẻ lấy giá trị có số thứ
tự là dwIndex+1. Do vậy ta có thể liệt kê tất cả các giá trị của một
khóa bằng vòng lặp và hiển nhiên tham số dwIndex có các giá trị phù hợp
là từ 0 đến số giá trị -1.
Các tham số
• hKey
Là hanle của khóa cần lấy giá trị
• dwIndex
là số thứ tự của giá trị cần lấy. Có giá trị phù hợp là 0 đến số giá trị -1.
• lpValueName
Nhận tên của giá trị mà hàm trả về.
• lpcbValueName
Chiều dài thực sự của giá trị. (Để chỉnh lại độ dài chuổi lpValueName)
• lpReserved
Thiết lập thành ByVal 0
• lpType
Biến nhận kiểu giá trị trả về, là một trong số các hằng số ở mục I(3)
• lpData
Biến nhận dữ liệu, nếu không cần thì thiết lập ByVal 0
• lpcbData
Biến nhận kích thước dữ liệu, nếu không cần thì thiết lập ByVal 0
Ví dụ liệt kê tất cả các giá trị có trong khóa
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr
entVersion\Uninstall\{91FF042A-6000-11D3-8CFE-0150048383C9}và lấy thông
tin của nó
Code:
Option Explicit
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Byte, lpcbData As Long) As Long
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const HKEY_CURRENT_USER = &H80000001
Private Const KEY_ALL_ACCESS = &HF003F
Private Const REG_SZ = 1
Private Const REG_BINARY = 3 ' Free form binary
Private Const REG_DWORD = 4 ' 32-bit number
Private Const REG_EXPAND_SZ = 2 ' Unicode nul terminated string
Private Const REG_MULTI_SZ = 7 ' Multiple Unicode strings
Dim retval As Long
Dim hKey As Long
Dim NameKey As String
Dim lpType As Long
Dim LenName As Long
Dim Data(0 To 255) As Byte
Dim DataLen As Long
Dim DataString As String
Dim index As Long
Dim i As Long
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Me.Cls
retval = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{91FF042A-6000-11D3-8CFE-0150048383C9}", 0, KEY_ALL_ACCESS, hKey)
index = 0
Do While retval = 0
NameKey = Space(255)
DataString = Space(255)
LenName = 255
DataLen = 255
retval = RegEnumValue(hKey, index, NameKey, LenName, ByVal 0, lpType, Data(0), DataLen)
If retval = 0 Then
NameKey = Left(NameKey, LenName) ‘Rút bỏ khoản trống thừa
DataString = ""
‘ Xử lý thông tin theo kiểu của nó và đưa vào biến DataString
Select Case lpType
Case REG_SZ
For i = 0 To DataLen - 1
DataString = DataString & Chr(Data(i)) ‘ Nối các chử cái thành chuổi
Next
Case REG_BINARY
For i = 0 To DataLen - 1
Dim temp As String
temp = Hex(Data(i))
If Len(temp) < 2 Then temp = String(2 - Len(temp), "0") & temp
DataString = DataString & temp & " "
‘ Nối các cặp số nhị phân lại với nhau
Next
Case REG_DWORD
For i = DataLen - 1 To 0 Step -1
DataString = DataString & Hex(Data(i)) ‘Nối các sô hexa với nhau
Next
Case REG_MULTI_SZ
For i = 0 To DataLen - 1
DataString = DataString & Chr(Data(i))
‘Nối các ký tự bao gồm ký tự vbNullChar (để cách dòng) thành một chuổi, bạn có thể sử dụng một mảng gồm nhiều string thay vì là một
Next
Case REG_EXPAND_SZ
For i = 0 To DataLen - 2
DataString = DataString & Chr(Data(i))
‘Nối các ký tự lại với nhau, bỏ ký tự NULL cuối cùng
Next
Case Else
DataString = " Khong xac dinh duoc !"
‘ Trên đây là 5 kiểu có trên WinXP
End Select
End If
Me.Print Left(NameKey, LenName) & " = " & DataString
index = index + 1
Loop
MsgBox "Co tat ca " & index - 1 & " gia tri"
retval = RegCloseKey(hKey)
End Sub
Ghi chú: Tôi lấy khóa trên vì thấy nó có khá nhiều kiểu dữ liệu, bạn
hãy làm thử với nhiều khóa khác sẻ thu được kết quả tương tự.
10) Hàm RegQueryValue
Khai báo
Declare Function RegQueryValue Lib "advapi32.dll" Alias "RegQueryValueA"
(ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpValue As String,
lpcbValue As Long) As Long
Hàm đọc dữ liệu của một giá trị trong registry. Hàm trả về 0 nếu thành
công hoặc là một mã lỗi khác 0 nếu thất bại. Thực tế rất khó vận dụng
hàm này vì không biết được kiểu dữ liệu của nó để xử lý. Bạn không nên
quan tâm đến hàm này.
11) Hàm RegQueryValueEx
Khai báo
Code:
Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long ' Note that if you declare the lpData parameter as String, you must pass it By Value.
Hàm đọc dữ liệu của một giá trị trong registry. Trả về 0 nếu thành công
và một mã lỗi khác 0 nếu thất bại. Thực tế hàm này không khác mấy so
với hàm RegEnumValue, trên lý thuyết hàm có khả năng đọc dữ liệu tốt hơn
hàm RegEnumValue vì biến số nhận dữ liệu lpData có thể là nhiều kiểu
khác nhau như Byte, Long, String… nên có thể nhận trực tiếp một số kiểu
giá trị mà không cần phải xử lý. Tuy nhiên trên Windows XP ta chỉ gặp
phải năm kiểu dữ liệu như trên ví dụ, và việc xử lý cũng không mấy phức
tạp lắm.
Các tham số
Hoàn toàn tương tự như hàm RegEnumValue, chỉ khác ở chổ tham số lpData
bạn có thể khai báo bằng các kiểu là Integer, Byte, Long, String và một
kiểu bất kỳ do bạn tự định nghĩa. Lưu ý nếu là khai báo kiểu String thì
bạn phải đặt từ khóa ByVal ở đầu (bắt buộc).
12) Hàm RegQueryValueEx
Khai báo
Code:
Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long ' Note that if you declare the lpData parameter as String, you must pass it By Value.
Hàm ghi dữ liệu vào registry, có thể ghi với nhiều kiểu dữ liệu khác
nhau. Giá trị trả về là 0 nếu thành công hoặc một mã lỗi khác 0 nếu thất
bại.
Các tham số
• hKey
Hanle của khóa cần ghi dữ liệu.
• lpValueName
Tên giá trị cần lưu, nếu đã có thì hàm sẻ ghi đè thông tin vào nó, nếu
chưa có thì hàm sẻ tạo mới. Đặc biệt nếu bạn muốn lưu thông tin vào giá
trị Default thì bạn truyền vào một chuổi rổng (“”).
• Reserved
Thiết lập là 0.
• dwType
Chỉ rỏ kiểu của dữ liệu cần ghi, có thể là một trong các giá trị ở mục
I(3). Lưu ý hàm sẻ tự động xử lý dữ liệu lpData để ghi vào registry phù
hợp với kiểu dữ liệu nên trong đa số trường hợp bạn không phải bận tâm
xử lý dữ liệu như lúc đọc registry.
• lpData
Một biến, có thể là một hoặc một mảng các Byte, Integer, Long, String,
hoặc một kiểu biến tự định nghĩa để đưa thông tin cần lưu. Chú ý nếu đã
định nghĩa là String thì bắt buộc phải thêm ByVal ở trước.
• cbData
Kích thước (tính bằng byte) của dữ liệu đưa vào. Có thể xác định bằng hàm Len().
Ví dụ
Code:
DataString = "My Setting" vbNullChar
retval = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\Quang Hoa", _ 0, KEY_ALL_ACCESS, hKey)
retval = RegSetValueEx(hKey, "Setting", 0, REG_SZ, ByVal DataString, _ Len(DataString))
retval = RegCloseKey(hKey)
Một chút về Registry
Bình thường Registry gồm có 5 khóa cơ sở đó là
Code:
1) HKEY_CLASSES_ROOT Thông tin hệ điều hành
2) HKEY_CURRENT_CONFIG Thông tin cấu hình hiện tại của máy tính
3) HKEY_LOCAL_MACHINE Thông tin các chương trình cho mọi người dùng
4) HKEY_CURRENT_USER Thông tin các chương trình cho người dùng hiện tại
5) HKEY_USERS Thông tin cho tất cả người dùng
Mỗi khóa cơ sở chứa các khóa con, mỗi khóa con lại chứa các khóa con với
lớp thấp hơn. Vì vậy nên một khóa bất kỳ trong registry có thể là khóa
con của khóa này nhưng cũng có thể là khóa cha của khóa kia.
Trong một khóa có thể có một hay nhiều giá trị (String Value). Giá trị
(Default) là giá trị luôn có trong một khóa. Mỗi giá trị đó có mỗi dữ
liệu riêng tương ứng với kiểu dữ liệu của nó, đây là phần quan trọng
nhất của registry . Trong registry có nhiều kiểu dữ liệu, phổ biến là.
Code:
1) REG_BINARY Một dãy bit thông tin
2) REG_DWORD Một số nguyên 32 Bit
3) REG_SZ Một chuổi Unicode
4) REG_MULTI_SZ Nhiều chuổi Unicode
Visual Basic đã cung cấp 4 hàm để xử lý Registry
Code:
1. GetAllSettings (appname, section)
Chức năng: lấy tất cả các thông tin của appname trong registry.
Ví dụ lấy các thông tin trong khóa Startup của Myapp
Code:
MySettings = GetAllSettings("MyApp", "Startup")
Code:
2. GetSetting (appname, section, key [, default])
Chức năng, lấy thông tin được lưu trong key, thuộc khóa section của
appname, giá trị default (có thể bỏ qua) là giá trị trả về nếu thông tin
muốn lấy về không có trong registry
Ví dụ
Code:
MySettings = GetSetting(“MyApp", “Startup","Left", "25")
3. SaveSetting appname, section, key, setting
Chức năng: Lưu thông tin trong registry
Ví dụ
Code:
SaveSetting "MyApp", "Startup", "Left", 50
4. DeleteSetting appname, section [, key]
Chức năng, xóa khóa section trong appname
Ví dụ xóa thông tin của MyApp trong khóa Startup
Code:
DeleteSetting "MyApp", "Startup"
Thực chất thì các giá trị registry được lưu trong khóa
HKEY_CURRENT_USER\Software\VB and VBA Program Settings. Còn nếu muốn làm
việc trên các khóa khác thì ta phải dùng một số hàm API để xử lý. Chú ý
tất cả các hằng, các biến kiểu, các hàm dưới đây bạn phải thêm từ khóa
là Private ở phía trước nếu muốn dùng trong Form, và Private hoặc là
Public nếu bạn dùng trong một Module. Và trong một số ví dụ tôi sẻ bỏ
qua những phần khai báo chúng .
Giới thiệu vài hằng số thông dụng trong API khi xử lý registry
Code:
1) Các khóa cơ sở của registry
• HKEY_CLASSES_ROOT = &H80000000
• HKEY_CURRENT_CONFIG = &H80000005
• HKEY_LOCAL_MACHINE = &H80000002
• HKEY_CURRENT_USER = &H80000001
• HKEY_USERS = &H80000003
2) Các kiểu truy xuất registry
Code:
• KEY_ALL_ACCESS = &HF003F ‘Mọi kiểu truy xuất
• KEY_CREATE_LINK = &H20 ‘ Quyền tạo liên kết ký hiệu
• KEY_CREATE_SUB_KEY = &H4 ‘Quyền tạo khóa con
• KEY_ENUMERATE_SUB_KEYS = &H8 ‘Quyền liệt kê khóa con
• KEY_EXECUTE = &H20019 ‘Quyền đọc
• KEY_NOTIFY = &H10
• KEY_QUERY_VALUE = &H1
• KEY_READ = &H20019 ‘Quyền đọc
• KEY_SET_VALUE = &H2 ‘Quyền đặt giá trị
• KEY_WRITE = &H20006 ‘Quyền viết dữ liệu
3) Các kiểu giá trị trong registry
Code:
• REG_BINARY = 3 ‘Một chuổi nhị phân
• REG_DWORD = 4 ‘ Một số nguyên 32 bit
• REG_DWORD_BIG_ENDIAN = 5 ‘Số nguyên 32 bit
• REG_DWORD_LITTLE_ENDIAN = 4 ‘Số nguyên 32 bit
• REG_EXPAND_SZ = 2 ‘Một chuổi kết thúc bởi Null
• REG_LINK = 6 ‘Liên kết Unicode
• REG_MULTI_SZ = 7 ‘ Nhiều chuổi kết hợp bởi kt Null
• REG_NONE = 0 ‘ Không rỏ kiểu
• REG_SZ=1 ‘ Một chuổi
• REG_RESOURCE_LIST = 8 ‘ Danh sách tài nguyên
II. Biến kiểu
Code:
1) Kiểu SECURITY_ATTRIBUTES
Type SECURITY_ATTRIBUTES
nLength As Long ‘Chiều dài của chuổi bảo mật
lpSecurityDescriptor As Long ‘ Chuổi bảo mật
bInheritHandle As Long ‘ hanle
End Type
2) Kiểu FILETIME
Code:
Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
III. Các hàm cần dùng khi xử lý Registry
1) Hàm RegOpenKeyEx
Khai báo
Code:
Declare Function RegOpenKeyEx Lib “advapi32.dll” Alias “RegOpenKeyExA (ByVal hKey as long,ByVal lpSubKey as string,ByVal ulOptions As long,Byval Samdesired As long,phkResult As long) As long
Hàm có nhiệm vụ mở một khóa trong registry, nếu thành công, hàm sẻ trả
về giá trị là 0, đồng thời biến phkResult sẻ mang giá trị hanle của khóa
được mở. Nếu có lỗi xãy ra, có thể là do khóa registry không tồn tại
hoặc tồn tại nhưng bị cấm truy cập thì hàm trả về mã lỗi khác 0.
Các tham số
• hKey
Chỉ đến khóa chính, là một trong các khóa chính ở mục I (1)
• lpSubKey
Là tên khóa cần mở.
• ulOption
Không cần thiết, có thể lập thành 0
• samdesired
Khai báo kiểu truy cập, là một hoặc kết hợp nhiều giá trị trong các giá trị ở mục I (2)
• phkResult
Là biến nhận hanle của khóa registry nếu khóa được mở thành công.
2) Hàm RegCreateKey
Khai báo
Code:
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Tương tự hàm RegOpenKeyEx nhưng khác ở chổ nếu khóa chưa tồn tại thì hàm sẻ tạo ra nó.
Các tham số
• hKey
Chỉ đến khóa chính, là một trong các khóa chính ở mục I (1)
• lpSubKey
Là tên khóa cần tạo
• phkResult
Biến nhận hanle của khóa được tạo hoặc được mở
3) Hàm RegCreateKeyEx
Khai báo
Code:
Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, phkResult As Long, lpdwDisposition As Long) As Long
Tương tự hàm RegCreateKey nhưng khác chút là có thêm một số thiết lập là
• Reserved
Thiết lập là 0
• lpClass
Tên lớp hoặc đối tượng của khóa, có thể đặt là chuổi rổng (“”)
• dwOption
Là 0 nếu muốn lưu lâu dài trong registry, là 1 nếu chỉ muốn lưu tạm thời, sẻ bị mất khi Window Shutdown.
• samdesired
Khai báo kiểu truy cập, là một hoặc kết hợp nhiều giá trị trong các giá trị ở mục I (2)
• lpSecurityAttributes
Thiết lập đặc tính bảo mật cho khóa được tạo ra.
• lpdwDisposition
Biến nhận kết quả là 1 nếu khóa chưa có và được tạo mới, là 2 nếu khóa đã tồn tại và mở ra.
4) Hàm RegCloseKey
Khai báo
Code:
Declare Function RegCloseKey Lib "advapi32.dll" Alias "RegCloseKey" (ByVal hKey As Long) As Long
Hàm có nhiệm vụ đóng lại khóa sau khi đã được mở bởi hàm trên. Giá trị
trả về là 0 nếu thành công hoặc là một mã lỗi khác 0 nếu có lỗi xảy ra.
Tham số hKey là hanle của khóa cần đóng. Tương ứng với tham số phkResult trong hai hàm trên.
Ví dụ
a) Mở khóa HKEY_CURRENT_USER\Software\VBClub Soft. Sau đó đóng khóa lại.
Code:
Dim retval As Long ‘Nhận giá trị trả về của hàm
Dim hkey As Long ‘ Nhận Hanle của khóa
Private Sub Form_Load()
retval = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\VBClub Soft", 0, KEY_ALL_ACCESS, hkey)
If retval <> 0 Then
MsgBox "Khoa chua co !", vbCritical, "Error"
Else
MsgBox "Khoa da co va vua duoc mo !", vbInformation, "Infomation"
End If
retval = RegCloseKey(hkey)
End Sub
b) Mở khóa HKEY_CURRENT_USER\Software\VBClub Soft. Nếu khóa chưa có thì tạo mới. Sau đó đóng khóa lại.
Code:
Dim retval As Long ‘nhan giá trị tra ve
Dim hkey As Long ‘Nhan hanle cua khoa
Dim keynew As Long ‘ Xem xem khoa da co hay chua
Dim SA As SECURITY_ATTRIBUTES ‘Khong co y nghia
Private Sub Form_Load()
retval = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\VBClub Soft", 0, "", 0, KEY_ALL_ACCESS, SA, hkey, keynew)
If retval <> 0 Then
MsgBox "Loi khi tao khoa !", vbCritical, "Error"
Else
If keynew = 1 Then
MsgBox "Khoa da duoc tao moi !", vbInformation, "Infomation"
Else
MsgBox "Khoa da ton tai", vbInformation, "Infomation"
End If
End If
retval = RegCloseKey(hkey)
End Sub
5) Hàm RegDeleteValue
Khai báo
Code:
Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
Hàm xóa chuổi giá trị trong registry. Giá trị trả về sẻ là 0 nếu thành
công và trả về mã lỗi khác 0 nếu thất bại. Với Windows hiện hành, hàm
đều thực hiện thành công nếu trong khóa còn có các khóa con. Chú ý là
trước khi xóa một giá trị trong key thì ta phảI mở Key đó ra trước đã.
Tham số
• Hkey
Là hanle của khóa chưa khóa cần xóa
• lpValueName
Tên giá trị bị xóa
Ví dụ
Xóa chuổi giá trị “num” trong khóa HKEY_CURRENT_USER\Software\VBClub Soft
Code:
Dim retval As Long
Dim hKey As Long
Private Sub Form_Load()
retval = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\VBClub Soft", 0, KEY_ALL_ACCESS, hKey)
retval = RegDeleteValue(hKey, "num")
If retval = 0 Then
MsgBox "Da xoa gia tri thanh cong", vbInformation, "Xoa"
Else
MsgBox "Loi khi xoa khoa", vbCritical, "Error"
End If
retval = RegCloseKey(hKey)
End Sub
6) Hàm RegDeleteKey
Khai báo
Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
Hàm xóa key trong registry. Giá trị trả về sẻ là 0 nếu thành công và trả về mã lỗi khác 0 nếu thất bại.
Tham số
• Hkey
Là một trong các khóa chính ở mục I(1)
• lpSubKey
Tên khóa bị xóa
Ví dụ xóa khóa HKEY_CURRENT_USER\Software\VBClub Soft\me
Dim retval As Long
Private Sub Form_Load()
retval = RegDeleteKey(HKEY_CURRENT_USER, "Software\VBClub Soft\me")
If retval = 0 Then
MsgBox "Da xoa gia tri thanh cong", vbInformation, "Xoa"
Else
MsgBox "Loi khi xoa khoa", vbCritical, "Error"
End If
retval = RegCloseKey(hKey)
End Sub
7) Hàm RegEnumKey
Khai báo
Code:
Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long
Hàm lấy một khóa con của một khóa. Khóa chứa khóa con gọi là khóa cha.
Nếu thành công, hàm trả về giá trị là 0, nếu có lỗi xảy ra, hàm trả về
mã lỗi khác 0. Vì cứ mỗi lần gọi nó lại xác định một khóa con nên ta có
thể liệt kê tất cả khóa con của một khóa cha bằng vòng lặp.
Các tham số
• Hkey
Hanle của khóa cha, phảI được mở trước.
• dwIndex
Số thứ tự của khóa con trong số các khóa cha sẻ được lấy ra. Chú ý rẳng
trong khóa cha có nhiều khóa con thì các khóa con sẻ được sắp xếp theo
tên từ A đến Z. Và dwIndex hợp lệ phảI có giá trị từ 0 đến số khóa con –
1.
• lpName
Một chuổi để chứa tên của khóa con. Chú ý trước khi dùng nó, bạn phảI khởi tạo cho nó, có thể dùng hàm space()
• cbname
Ghi giá trị chính là chiều dài của tên khóa con. Rất quan trọng khi phảI chỉnh lại chiều dài của chuổi lpName.
Ví dụ: Liệt kê tất cả các khóa con của khóa HKEY_CURRENT_USER\Software
Thêm một command vào form.
Code:
Option Explicit
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long
Private Const HKEY_CURRENT_USER = &H80000001
Private Const KEY_ALL_ACCESS = &HF003F
Dim retval As Long
Dim hKey As Long
Dim namekey As String ‘Ten khoa con
Dim lenname As Long ‘ Ghi chieu dai cua khoa con
Dim index As Long ‘ So thu thu cua khoa con
Private Sub Command1_Click()
Me.Cls ‘ Xoa nhung gi trong form
namekey = Space(255) ‘ Khoi tao bien namekey
lenname = 255
index = 0
retval = RegOpenKeyEx(HKEY_CURRENT_USER, "Software", 0, KEY_ALL_ACCESS, hKey)
Do While retval = 0
retval = RegEnumKey(hKey, index, namekey, lenname)
If retval = 0 Then Me.Print Left(namekey, lenname) ‘In namekey
index = index + 1
Loop
MsgBox "Khoa co tat ca " & index -1 & " khoa con", vbInformation, "Thong tin"
retval = RegCloseKey(hKey)
End Sub
Hàm RegEnumKeyEx
Khai báo
Code:
Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, lpcbName As Long, ByVal lpReserved As Long, ByVal lpClass As String, lpcbClass As Long, lpftLastWriteTime As FILETIME) As Long
Tương tự hàm RegEnumKey, nhưng nó có điểm khác là thêm các tham số sau:
• lpReserved
Không có ý nghĩa, bạn khai báo ByVal 0
• lpClass
Chuổi chứa tên khóa con, tương tự như tham số lpName. Phải khởi tạo trước khi sử dụng.
• lpcbClass
Kích thước của lpClass
• lpftLastWriteTime
Chứa thời gian ghi, chỉnh sửa khóa cuối cùng.
9) Hàm RegEnumValue
Khai báo
Code:
Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Byte, lpcbData As Long) As Long
Hàm đọc một thông tin trong registry . Trong một khóa có nhiều giá trị
thì các chúng đó được sắp xếp có thứ tự và hàm sẻ lấy giá trị có số thứ
tự là dwIndex+1. Do vậy ta có thể liệt kê tất cả các giá trị của một
khóa bằng vòng lặp và hiển nhiên tham số dwIndex có các giá trị phù hợp
là từ 0 đến số giá trị -1.
Các tham số
• hKey
Là hanle của khóa cần lấy giá trị
• dwIndex
là số thứ tự của giá trị cần lấy. Có giá trị phù hợp là 0 đến số giá trị -1.
• lpValueName
Nhận tên của giá trị mà hàm trả về.
• lpcbValueName
Chiều dài thực sự của giá trị. (Để chỉnh lại độ dài chuổi lpValueName)
• lpReserved
Thiết lập thành ByVal 0
• lpType
Biến nhận kiểu giá trị trả về, là một trong số các hằng số ở mục I(3)
• lpData
Biến nhận dữ liệu, nếu không cần thì thiết lập ByVal 0
• lpcbData
Biến nhận kích thước dữ liệu, nếu không cần thì thiết lập ByVal 0
Ví dụ liệt kê tất cả các giá trị có trong khóa
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr
entVersion\Uninstall\{91FF042A-6000-11D3-8CFE-0150048383C9}và lấy thông
tin của nó
Code:
Option Explicit
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Byte, lpcbData As Long) As Long
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const HKEY_CURRENT_USER = &H80000001
Private Const KEY_ALL_ACCESS = &HF003F
Private Const REG_SZ = 1
Private Const REG_BINARY = 3 ' Free form binary
Private Const REG_DWORD = 4 ' 32-bit number
Private Const REG_EXPAND_SZ = 2 ' Unicode nul terminated string
Private Const REG_MULTI_SZ = 7 ' Multiple Unicode strings
Dim retval As Long
Dim hKey As Long
Dim NameKey As String
Dim lpType As Long
Dim LenName As Long
Dim Data(0 To 255) As Byte
Dim DataLen As Long
Dim DataString As String
Dim index As Long
Dim i As Long
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Me.Cls
retval = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{91FF042A-6000-11D3-8CFE-0150048383C9}", 0, KEY_ALL_ACCESS, hKey)
index = 0
Do While retval = 0
NameKey = Space(255)
DataString = Space(255)
LenName = 255
DataLen = 255
retval = RegEnumValue(hKey, index, NameKey, LenName, ByVal 0, lpType, Data(0), DataLen)
If retval = 0 Then
NameKey = Left(NameKey, LenName) ‘Rút bỏ khoản trống thừa
DataString = ""
‘ Xử lý thông tin theo kiểu của nó và đưa vào biến DataString
Select Case lpType
Case REG_SZ
For i = 0 To DataLen - 1
DataString = DataString & Chr(Data(i)) ‘ Nối các chử cái thành chuổi
Next
Case REG_BINARY
For i = 0 To DataLen - 1
Dim temp As String
temp = Hex(Data(i))
If Len(temp) < 2 Then temp = String(2 - Len(temp), "0") & temp
DataString = DataString & temp & " "
‘ Nối các cặp số nhị phân lại với nhau
Next
Case REG_DWORD
For i = DataLen - 1 To 0 Step -1
DataString = DataString & Hex(Data(i)) ‘Nối các sô hexa với nhau
Next
Case REG_MULTI_SZ
For i = 0 To DataLen - 1
DataString = DataString & Chr(Data(i))
‘Nối các ký tự bao gồm ký tự vbNullChar (để cách dòng) thành một chuổi, bạn có thể sử dụng một mảng gồm nhiều string thay vì là một
Next
Case REG_EXPAND_SZ
For i = 0 To DataLen - 2
DataString = DataString & Chr(Data(i))
‘Nối các ký tự lại với nhau, bỏ ký tự NULL cuối cùng
Next
Case Else
DataString = " Khong xac dinh duoc !"
‘ Trên đây là 5 kiểu có trên WinXP
End Select
End If
Me.Print Left(NameKey, LenName) & " = " & DataString
index = index + 1
Loop
MsgBox "Co tat ca " & index - 1 & " gia tri"
retval = RegCloseKey(hKey)
End Sub
Ghi chú: Tôi lấy khóa trên vì thấy nó có khá nhiều kiểu dữ liệu, bạn
hãy làm thử với nhiều khóa khác sẻ thu được kết quả tương tự.
10) Hàm RegQueryValue
Khai báo
Declare Function RegQueryValue Lib "advapi32.dll" Alias "RegQueryValueA"
(ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpValue As String,
lpcbValue As Long) As Long
Hàm đọc dữ liệu của một giá trị trong registry. Hàm trả về 0 nếu thành
công hoặc là một mã lỗi khác 0 nếu thất bại. Thực tế rất khó vận dụng
hàm này vì không biết được kiểu dữ liệu của nó để xử lý. Bạn không nên
quan tâm đến hàm này.
11) Hàm RegQueryValueEx
Khai báo
Code:
Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long ' Note that if you declare the lpData parameter as String, you must pass it By Value.
Hàm đọc dữ liệu của một giá trị trong registry. Trả về 0 nếu thành công
và một mã lỗi khác 0 nếu thất bại. Thực tế hàm này không khác mấy so
với hàm RegEnumValue, trên lý thuyết hàm có khả năng đọc dữ liệu tốt hơn
hàm RegEnumValue vì biến số nhận dữ liệu lpData có thể là nhiều kiểu
khác nhau như Byte, Long, String… nên có thể nhận trực tiếp một số kiểu
giá trị mà không cần phải xử lý. Tuy nhiên trên Windows XP ta chỉ gặp
phải năm kiểu dữ liệu như trên ví dụ, và việc xử lý cũng không mấy phức
tạp lắm.
Các tham số
Hoàn toàn tương tự như hàm RegEnumValue, chỉ khác ở chổ tham số lpData
bạn có thể khai báo bằng các kiểu là Integer, Byte, Long, String và một
kiểu bất kỳ do bạn tự định nghĩa. Lưu ý nếu là khai báo kiểu String thì
bạn phải đặt từ khóa ByVal ở đầu (bắt buộc).
12) Hàm RegQueryValueEx
Khai báo
Code:
Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long ' Note that if you declare the lpData parameter as String, you must pass it By Value.
Hàm ghi dữ liệu vào registry, có thể ghi với nhiều kiểu dữ liệu khác
nhau. Giá trị trả về là 0 nếu thành công hoặc một mã lỗi khác 0 nếu thất
bại.
Các tham số
• hKey
Hanle của khóa cần ghi dữ liệu.
• lpValueName
Tên giá trị cần lưu, nếu đã có thì hàm sẻ ghi đè thông tin vào nó, nếu
chưa có thì hàm sẻ tạo mới. Đặc biệt nếu bạn muốn lưu thông tin vào giá
trị Default thì bạn truyền vào một chuổi rổng (“”).
• Reserved
Thiết lập là 0.
• dwType
Chỉ rỏ kiểu của dữ liệu cần ghi, có thể là một trong các giá trị ở mục
I(3). Lưu ý hàm sẻ tự động xử lý dữ liệu lpData để ghi vào registry phù
hợp với kiểu dữ liệu nên trong đa số trường hợp bạn không phải bận tâm
xử lý dữ liệu như lúc đọc registry.
• lpData
Một biến, có thể là một hoặc một mảng các Byte, Integer, Long, String,
hoặc một kiểu biến tự định nghĩa để đưa thông tin cần lưu. Chú ý nếu đã
định nghĩa là String thì bắt buộc phải thêm ByVal ở trước.
• cbData
Kích thước (tính bằng byte) của dữ liệu đưa vào. Có thể xác định bằng hàm Len().
Ví dụ
Code:
DataString = "My Setting" vbNullChar
retval = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\Quang Hoa", _ 0, KEY_ALL_ACCESS, hKey)
retval = RegSetValueEx(hKey, "Setting", 0, REG_SZ, ByVal DataString, _ Len(DataString))
retval = RegCloseKey(hKey)