• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Hướng dẫn xử lý Registry trong VB6

Các bài viết hướng dẫn, giúp các bạn hiểu và tiếp cận với Visual Basic nhanh hơn
QuangHoa
Guru
Guru
Posts: 542
Joined: Thu 27/03/2008 9:02 am
Location: Quê hương Đại tướng Võ Nguyên Giáp
Been thanked: 5 times
Contact:

Hướng dẫn xử lý Registry trong VB6

Postby QuangHoa » Mon 09/06/2008 10:05 am

Tên bài viết: Xử lý Registry trong Visual Basic 6.0
Tác giả: Võ Quang Hòa
Cấp độ bài viết: Từ cơ bản đến nâng cao
Tóm tắt: Thông tin về Registry, các kiểu dữ liệu có thể dùng, các hằng số, các hàm cùng với những thao tác chủ yếu


Một chút về Registry
Bình thường Registry gồm có 5 khóa cơ sở đó là

Code: Select all

  1. 1)  HKEY_CLASSES_ROOT Thông tin hệ điều hành
  2. 2)  HKEY_CURRENT_CONFIG Thông tin cấu hình hiện tại của máy tính
  3. 3)  HKEY_LOCAL_MACHINE Thông tin các chương trình cho mọi người dùng
  4. 4)  HKEY_CURRENT_USER Thông tin các chương trình cho người dùng hiện tại
  5. 5)  HKEY_USERS Thông tin cho tất cả người dùng

Image
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: Select all

  1. 1)  REG_BINARY Một dãy bit thông tin
  2. 2)  REG_DWORD Một số nguyên 32 Bit
  3. 3)  REG_SZ    Một chuổi Unicode
  4. 4)  REG_MULTI_SZ Nhiều chuổi Unicode


Visual Basic đã cung cấp 4 hàm để xử lý Registry

Code: Select all

  1. 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: Select all

  1. MySettings = GetAllSettings("MyApp", "Startup")
  2.  

Code: Select all

  1. 2GetSetting (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: Select all

  1. MySettings = GetSetting(“MyApp", “Startup","Left", "25")
  2.  
  3.  

3. SaveSetting appname, section, key, setting
Chức năng: Lưu thông tin trong registry
Ví dụ

Code: Select all

  1. 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: Select all

  1. 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: Select all

  1. 1)  Các khóa cơ sở của registry
  2. • HKEY_CLASSES_ROOT = &H80000000
  3. • HKEY_CURRENT_CONFIG = &H80000005
  4. • HKEY_LOCAL_MACHINE = &H80000002
  5. • HKEY_CURRENT_USER = &H80000001
  6. • HKEY_USERS = &H80000003

2) Các kiểu truy xuất registry

Code: Select all

  1. • KEY_ALL_ACCESS = &HF003F ‘Mọi kiểu truy xuất
  2. • KEY_CREATE_LINK = &H20 ‘ Quyền tạo liên kết ký hiệu
  3. • KEY_CREATE_SUB_KEY = &H4 ‘Quyền tạo khóa con
  4. • KEY_ENUMERATE_SUB_KEYS = &H8 ‘Quyền liệt kê khóa con
  5. • KEY_EXECUTE = &H20019 ‘Quyền đọc
  6. • KEY_NOTIFY = &H10
  7. • KEY_QUERY_VALUE = &H1
  8. • KEY_READ = &H20019 ‘Quyền đọc
  9. • KEY_SET_VALUE = &H2 ‘Quyền đặt giá trị
  10. • KEY_WRITE = &H20006 ‘Quyền viết dữ liệu

3) Các kiểu giá trị trong registry

Code: Select all

  1. • REG_BINARY = 3  ‘Một chuổi nhị phân
  2. • REG_DWORD = 4   ‘ Một số nguyên 32 bit                
  3. • REG_DWORD_BIG_ENDIAN = 5  ‘Số nguyên 32 bit        
  4. • REG_DWORD_LITTLE_ENDIAN = 4  ‘Số nguyên 32 bit              
  5. • REG_EXPAND_SZ = 2   ‘Một chuổi kết thúc bởi Null  
  6. • REG_LINK = 6  ‘Liên kết Unicode  
  7. • REG_MULTI_SZ = 7 ‘ Nhiều chuổi kết hợp bởi kt Null    
  8. • REG_NONE = 0   ‘ Không rỏ kiểu    
  9. • REG_SZ=1  ‘ Một chuổi  
  10. • REG_RESOURCE_LIST = 8 ‘ Danh sách tài nguyên

II. Biến kiểu

Code: Select all

  1. 1)  Kiểu SECURITY_ATTRIBUTES
  2. Type SECURITY_ATTRIBUTES
  3.         nLength As Long ‘Chiều dài của chuổi bảo mật
  4.         lpSecurityDescriptor As Long ‘ Chuổi bảo mật
  5.         bInheritHandle As Long ‘ hanle
  6. End Type

2) Kiểu FILETIME

Code: Select all

  1. Type FILETIME
  2.         dwLowDateTime As Long
  3.         dwHighDateTime As Long
  4. End Type

III. Các hàm cần dùng khi xử lý Registry
1) Hàm RegOpenKeyEx
Khai báo

Code: Select all

  1. 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: Select all

  1. 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: Select all

  1. 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: Select all

  1. 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: Select all

  1. Dim retval As Long ‘Nhận giá trị trả về của hàm
  2. Dim hkey As Long ‘ Nhận Hanle của khóa
  3. Private Sub Form_Load()
  4. retval = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\VBClub Soft", 0, KEY_ALL_ACCESS, hkey)
  5. If retval <> 0 Then
  6.     MsgBox "Khoa chua co !", vbCritical, "Error"
  7. Else
  8.     MsgBox "Khoa da co va vua duoc mo !", vbInformation, "Infomation"
  9. End If
  10. retval = RegCloseKey(hkey)
  11. 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: Select all

  1. Dim retval As Long ‘nhan giá trị tra ve
  2. Dim hkey As Long ‘Nhan hanle cua khoa
  3. Dim keynew As Long ‘ Xem xem khoa da co hay chua
  4. Dim SA As SECURITY_ATTRIBUTES ‘Khong co y nghia
  5. Private Sub Form_Load()
  6. retval = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\VBClub Soft", 0, "", 0, KEY_ALL_ACCESS, SA, hkey, keynew)
  7. If retval <> 0 Then
  8.     MsgBox "Loi khi tao khoa !", vbCritical, "Error"
  9. Else
  10.     If keynew = 1 Then
  11.         MsgBox "Khoa da duoc tao moi !", vbInformation, "Infomation"
  12.     Else
  13.         MsgBox "Khoa da ton tai", vbInformation, "Infomation"
  14.     End If
  15. End If
  16. retval = RegCloseKey(hkey)
  17. End Sub
5) Hàm RegDeleteValue
Khai báo

Code: Select all

  1. 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: Select all

  1. Dim retval As Long
  2. Dim hKey As Long
  3. Private Sub Form_Load()
  4. retval = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\VBClub Soft", 0, KEY_ALL_ACCESS, hKey)
  5. retval = RegDeleteValue(hKey, "num")
  6. If retval = 0 Then
  7.     MsgBox "Da xoa gia tri thanh cong", vbInformation, "Xoa"
  8. Else
  9.     MsgBox "Loi khi xoa khoa", vbCritical, "Error"
  10. End If
  11. retval = RegCloseKey(hKey)
  12. 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: Select all

  1. 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: Select all

  1. Option Explicit
  2. Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
  3. 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
  4. 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
  5. Private Const HKEY_CURRENT_USER = &H80000001
  6. Private Const KEY_ALL_ACCESS = &HF003F
  7. Dim retval As Long
  8. Dim hKey As Long
  9. Dim namekey As String ‘Ten khoa con
  10. Dim lenname As Long ‘ Ghi chieu dai cua khoa con
  11. Dim index As Long ‘ So thu thu cua khoa con
  12. Private Sub Command1_Click()
  13. Me.Cls ‘ Xoa nhung gi trong form
  14. namekey = Space(255) ‘ Khoi tao bien namekey
  15. lenname = 255
  16. index = 0
  17. retval = RegOpenKeyEx(HKEY_CURRENT_USER, "Software", 0, KEY_ALL_ACCESS, hKey)
  18. Do While retval = 0
  19. retval = RegEnumKey(hKey, index, namekey, lenname)
  20. If retval = 0 Then Me.Print Left(namekey, lenname) ‘In namekey
  21. index = index + 1
  22. Loop
  23. MsgBox "Khoa co tat ca " & index -1  & " khoa con", vbInformation, "Thong tin"
  24. retval = RegCloseKey(hKey)
  25. End Sub
8) Hàm RegEnumKeyEx
Khai báo

Code: Select all

  1. 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: Select all

  1. 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\CurrentVersion\Uninstall\{91FF042A-6000-11D3-8CFE-0150048383C9}và lấy thông tin của nó

Code: Select all

  1. Option Explicit
  2. Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
  3. 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
  4. 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
  5. Private Const HKEY_LOCAL_MACHINE = &H80000002
  6. Private Const HKEY_CURRENT_USER = &H80000001
  7. Private Const KEY_ALL_ACCESS = &HF003F
  8. Private Const REG_SZ = 1
  9. Private Const REG_BINARY = 3                     ' Free form binary
  10. Private Const REG_DWORD = 4                      ' 32-bit number
  11. Private Const REG_EXPAND_SZ = 2                  ' Unicode nul terminated string
  12. Private Const REG_MULTI_SZ = 7                   ' Multiple Unicode strings
  13. Dim retval As Long
  14. Dim hKey As Long
  15. Dim NameKey As String
  16. Dim lpType As Long
  17. Dim LenName As Long
  18. Dim Data(0 To 255) As Byte
  19. Dim DataLen As Long
  20. Dim DataString As String
  21. Dim index As Long
  22. Dim i As Long
  23. Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  24. Me.Cls
  25. retval = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{91FF042A-6000-11D3-8CFE-0150048383C9}", 0, KEY_ALL_ACCESS, hKey)
  26. index = 0
  27. Do While retval = 0
  28.     NameKey = Space(255)
  29.     DataString = Space(255)
  30.     LenName = 255
  31.     DataLen = 255
  32.     retval = RegEnumValue(hKey, index, NameKey, LenName, ByVal 0, lpType, Data(0), DataLen)
  33.     If retval = 0 Then
  34.         NameKey = Left(NameKey, LenName) ‘Rút bỏ khoản trống thừa
  35.         DataString = ""
  36. ‘ Xử lý thông tin theo kiểu của nó và đưa vào biến DataString
  37.         Select Case lpType
  38.              Case REG_SZ
  39.                 For i = 0 To DataLen - 1
  40.                     DataString = DataString & Chr(Data(i)) ‘ Nối các chử cái thành chuổi
  41.                 Next
  42.              Case REG_BINARY
  43.                 For i = 0 To DataLen - 1
  44.                     Dim temp As String
  45.                     temp = Hex(Data(i))
  46.                     If Len(temp) < 2 Then temp = String(2 - Len(temp), "0") & temp
  47.                     DataString = DataString & temp & " "
  48.  ‘ Nối các cặp số nhị phân lại với nhau
  49.                 Next
  50.             Case REG_DWORD
  51.                 For i = DataLen - 1 To 0 Step -1
  52.                     DataString = DataString & Hex(Data(i)) ‘Nối các sô hexa với nhau
  53.                 Next
  54.             Case REG_MULTI_SZ
  55.                 For i = 0 To DataLen - 1
  56.                     DataString = DataString & Chr(Data(i))
  57.     ‘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
  58.                 Next
  59.             Case REG_EXPAND_SZ
  60.                 For i = 0 To DataLen - 2
  61.                     DataString = DataString & Chr(Data(i))
  62.     ‘Nối các ký tự lại với nhau, bỏ ký tự NULL cuối cùng
  63.                 Next   
  64.             Case Else
  65.                 DataString = " Khong xac dinh duoc !"
  66.         ‘ Trên đây là 5 kiểu có trên WinXP
  67.         End Select
  68.     End If
  69.     Me.Print Left(NameKey, LenName) & " = " & DataString
  70.     index = index + 1
  71. Loop
  72. MsgBox "Co tat ca " & index - 1 & " gia tri"
  73. retval = RegCloseKey(hKey)
  74. 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: Select all

  1. 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: Select all

  1. 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: Select all

  1. DataString = "My Setting" vbNullChar
  2. retval = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\Quang Hoa", _ 0, KEY_ALL_ACCESS, hKey)
  3. retval = RegSetValueEx(hKey, "Setting", 0, REG_SZ, ByVal DataString,  _  Len(DataString))
  4. retval = RegCloseKey(hKey)

Có gì thắc mắc thì Reply hỏi nhé. Sẻ trả lời sau.
Chúc thành công. Thân.
Có thể tải file gốc bên dưới:
Registry in VISUAL BASIC.rar
bản gốc
(56.89 KiB) Downloaded 2072 times
Last edited by QuangHoa on Thu 12/06/2008 9:03 am, edited 1 time in total.


朋友
这些年一个人风也过雨也走,有过泪有过错还记得坚持什么。
真爱过才会懂会记没会回手,终有梦中有你在心中。
朋友一生一起走那些日子不再有,一句话一辈子一生情一杯九。
朋友不曾孤单过一声朋友你会懂,还有伤还有痛还要走还有我。

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 519 times

Hướng dẫn thao tác trên Registry

Postby truongphu » Tue 18/11/2008 10:32 am

Tên bài viết: Hướng dẫn thao tác trên Registry (Với kỹ thuật Script WMI)
Tác giả: truongphu
Cấp độ bài viết: Chưa đánh giá
Tóm tắt: Script WMI thao tác dễ dàng trên tất cả các định dạng của khóa và được xem là code chuẩn của kỹ thuật Script khi thao tác với Registry


Hướng dẫn thao tác trên Registry
Với kỹ thuật Sript WMI

Trong bài “Registry với VBS” http://caulacbovb.com/forum/viewtopic.php?f=30&t=2145&start=0&st=0&sk=t&sd=a
Tôi có giới thiệu hai kỹ thuật thao tác trên Registry nhanh, gọn và dễ nắm bắt:
- Script Shell với lệnh khai báo thông thường là:

Code: Select all

  1. Set obj = CreateObject("WScript.Shell")

- Script WMI với lệnh khai báo thông thường là:

Code: Select all

  1. Set objRegistry = GetObject("winmgmts:\\" & "." & "\root\default:StdRegProv")


Script Shell thì quá đơn giản chỉ với 3 phương thức:
obj.RegRead để đọc
obj.RegDelete để xóa
obj.RegWrite để viết
Tuy nhiên nhược điểm của Script Shell là chỉ thao tác với các giá trị của khóa có định dạng là String: REG_SZ. Các định dạng của khóa khác tôi cố tìm hiểu nhưng đến giờ vẫn chưa gặp! Trong khi đó Script WMI lại thao tác dễ dàng trên tất cả các định dạng của khóa và được xem là code chuẩn của kỹ thuật Script khi thao tác với Registry. Thế cho nên, hôm nay tôi viết lại bài “Registry với VBS”, với mục WMI có phần khúc chiết hơn…

A- Các hằng số trong Registry
A1- Hằng số Gốc các nhánh: thông thường hay dùng:

Code: Select all

  1. Const HKEY_CURRENT_USER = &H80000001
  2. Const HKEY_LOCAL_MACHINE = &H80000002

A2- Hằng số định dạng giá trị của khóa: biết nhưng không dùng

Code: Select all

  1. Const REG_SZ = 1
  2. Const REG_EXPAND_SZ = 2
  3. Const REG_BINARY = 3
  4. Const REG_DWORD = 4
  5. Const REG_MULTI_SZ = 7


B- Cấu trúc câu lệnh SCRIPT/WMI
Xét câu lệnh:

Code: Select all

  1. objReg.GetStringValue &H80000002, strKeyPath, strValueName, strValue

- objReg là đối tượng được khai báo ban đầu
- GetStringValue là phương thức mà objReg làm việc
- &H80000002 hoặc HKEY_LOCAL_MACHINE là gốc một nhánh registry
- strKeyPath (đối số) là đường dẫn sau gốc nhánh
- strValueName (đối số) là tên khóa
- strValue (đối số) là giá trị của khóa
Lưu ý Đối tượng và các đối số có thể đặt tên tùy ý nhưng phương thức thì không thay đổi, vì đó là hàm mà đối tượng gọi ra để thao tác.
(Còn tiếp)
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 519 times

Re: Hướng dẫn thao tác trên Registry

Postby truongphu » Tue 18/11/2008 9:39 pm

C- Khai báo đối tượng (object) để thao tác:

Code: Select all

  1. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")

Câu trên là code được rút gọn (TTD)
Winmgmt (ở trên có ký tự s) là trình tương tác với toàn bộ máy tính (và mạng), nằm trong WINDOWS\system32\wbem
Ta gán objReg là object có các thuộc tính của nhánh thư mục StdRegProv, đây là nhánh mà object có các phương thức thao tác trên các file registry

D- Các phương thức thao tác trên Registry

D1- Code đọc các giá trị khóa có định dạng: REG_SZ
Đọc giá trị của khóa DNS Server trong NetWorking. Nếu máy tính để chế độ Auto, giá trị của khóa nầy thông thường chính là địa chỉ IP của Modem ASDL

Dùng phương thức GetStringValue

Code: Select all

  1. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  2. strKeyPath = "SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{1CD45787-B794-487F-AC99-414A4479C570}"
  3. strValueName = "NameServer"
  4. objReg.GetStringValue &H80000002, strKeyPath, strValueName, strValue
  5. MsgBox strValue


D2- Code đọc các giá trị khóa có định dạng: REG_DWORD
Đọc giá trị của khóa EnableDHCP trong NetWorking. Nếu máy tính để chế độ Auto, giá trị của khóa nầy là 1, nếu chủ động Disable, giá trị là 0

Dùng phương thức GetDWORDValue

Code: Select all

  1. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  2. strKeyPath = "SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{1CD45787-B794-487F-AC99-414A4479C570}"
  3. strValueName = "EnableDHCP"
  4. objReg.GetDWORDValue &H80000002, strKeyPath, strValueName, dwValue
  5. MsgBox dwValue


D3- Code đọc các giá trị khóa có định dạng: REG_MULTI_SZ
Đọc giá trị của khóa IPAddress trong NetWorking

Dùng phương thức GetMultiStringValue kèm vòng lặp For...Next

Code: Select all

  1. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  2. strKeyPath = "SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{1CD45787-B794-487F-AC99-414A4479C570}"
  3. strValueName = "IPAddress"
  4. objReg.GetMultiStringValue &H80000002, strKeyPath, strValueName, arrValues
  5. For Each strValue In arrValues
  6.     MsgBox strValue
  7. Next

(Còn tiếp)
Last edited by truongphu on Wed 19/11/2008 9:16 am, edited 1 time in total.
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 519 times

Re: Hướng dẫn thao tác trên Registry

Postby truongphu » Wed 19/11/2008 9:15 am

D4- Code đọc các giá trị khóa có định dạng: REG_EXPAND_SZ
Đọc giá trị của khóa UIHost trong WinLogon

Dùng phương thức GetExpandedStringValue ( cũng có thể dùng GetMultiStringValue)

Code: Select all

  1. Const HKEY_LOCAL_MACHINE = &H80000002
  2. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  3. strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon"
  4. strValueName = "UIHost"
  5. objReg.GetExpandedStringValue HKEY_LOCAL_MACHINE, strKeyPath, _
  6.     strValueName, strValue
  7.  
  8. MsgBox "The Windows logon UI host is: " & strValue


D5- Code đọc các giá trị khóa có định dạng: REG_BINARY
Đọc giá trị của khóa LicenseInfo trong CurrentVersion

Dùng phương thức GetBinaryValue với vòng lặp For…Next

Code: Select all

  1. Const HKEY_LOCAL_MACHINE = &H80000002
  2. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  3. strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"
  4. strValueName = "LicenseInfo"
  5. objReg.GetBinaryValue &H80000002, strKeyPath, strValueName, strValue
  6.  
  7. For i = LBound(strValue) To UBound(strValue)
  8.     b = b & strValue(i) & " "
  9. Next
  10. MsgBox b


D6- Code đọc nhiều giá trị khóa
Đọc tất cả các khóa trong strKeyPath = "SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{1CD45787-B794-487F-AC99-414A4479C570}"

a- Gọi phương thức: EnumValues để tạo các tên khóa và giá trị đi kèm vào 2 mảng arrValueNames, arrValueTypes.
b- Sau đó tiến hành đọc theo MỘT trong các phương thức như trên với vòng lặp For…Next

Code: Select all

  1. Const HKEY_LOCAL_MACHINE = &H80000002
  2. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  3. strKeyPath = "SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{1CD45787-B794-487F-AC99-414A4479C570}"
  4. objReg.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes
  5.  
  6. For i = 0 To UBound(arrValueNames)
  7.  a = a & "File Name: " & arrValueNames(i)
  8.  objReg.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames(i), arrValueTypes(i)
  9.  a = a & vbTab & vbTab & "Value: " & arrValueTypes(i) & vbCrLf
  10. Next
  11. MsgBox a


Như các bạn test và thấy: một số giá trị không biểu hiện vì chúng khác định dạng REG_SZ nên hàm GetStringValue không nhận được giá trị trả về.
Ví dụ thay objReg.GetStringValue bằng objReg.GetDWORDValue chúng ta lại có kết quả khác: các giá trị REG_DWORD hiện ra ..
(Còn nữa)
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 519 times

Re: Hướng dẫn thao tác trên Registry

Postby truongphu » Wed 19/11/2008 12:09 pm

Cố viết cho xong, sao lại dài thế nhỉ? tưởng đâu đơn giản...
D7- Code liệt kê các Subkey
Liệt kê tất cả các Subkey dưới nhánh HKLM\SYSTEM\CurrentControlSet\Services.

Dùng phương thức EnumKey để tạo các tên các Subkey vào mảng arrSubkeys, dùng vòng lặp For…Next để nhận giá trị các Subkey

Code: Select all

  1. Const HKEY_LOCAL_MACHINE = &H80000002
  2. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  3. strKeyPath = "SYSTEM\CurrentControlSet\Services"
  4. objReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys
  5.  
  6. For Each subkey In arrSubKeys
  7.     a = a & subkey & vbTab
  8. Next
  9. MsgBox a


Với Code trên, bạn có thể liệt kê tạo cây thư mục của bất cứ nhánh Registry nào sẵn có
Ví dụ: Code Liệt kê các Subkey dưới gốc HKEY_LOCAL_MACHINE

Code: Select all

  1. Const HKEY_LOCAL_MACHINE = &H80000002
  2. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  3. strKeyPath = ""
  4. objReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys
  5.  
  6. For Each subkey In arrSubKeys
  7.     a = a & subkey & vbTab
  8. Next
  9. MsgBox a

…vv

D8- Code tạo một subkey
Tạo một subkey “aaaa” trong nhánh HKEY_LOCAL_MACHINE\Sofware

Dùng phương thức CreateKey

Code: Select all

  1. Const HKEY_LOCAL_MACHINE = &H80000002
  2. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  3. strKeyPath = "SOFTWARE\aaaa"
  4. objReg.CreateKey HKEY_LOCAL_MACHINE, strKeyPath


và ta có thể cứ như thế tạo tiếp subkey “d” dưới subkey “SOFTWARE\bbb\cc” (đi tắt, khỏi tạo lần lượt bbb rồi cc)

Code: Select all

  1. Const HKEY_LOCAL_MACHINE = &H80000002
  2. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  3. strKeyPath = "SOFTWARE\bbb\cc\d"
  4. objReg.CreateKey HKEY_LOCAL_MACHINE, strKeyPath

Lưu ý: Trong các bài tới tôi sẽ xóa các Subkey vừa tạo ra trên
(Còn nữa, tối nay hoặc sáng mai là hết)
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 519 times

Re: Hướng dẫn thao tác trên Registry

Postby truongphu » Wed 19/11/2008 1:31 pm

D9- Code tạo một khóa định dạng REG_SZ
Tạo khóa “String Value Name” dưới nhánh HKLM\SOFTWARE\aaaa
(Ghi chú: nhánh HKLM\SOFTWARE\aaaa phải có, nếu không có thì không tác dụng)

Dùng phương thức SetStringValue
Const HKEY_LOCAL_MACHINE = &H80000002

Code: Select all

  1. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  2. strKeyPath = "SOFTWARE\aaaa"
  3. strValueName = "String Value Name"
  4. strValue = "asdf123"
  5.  
  6. objReg.SetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue


D10- Code tạo một khóa định dạng REG_EXPAND_SZ
Tạo khóa “Expanded String Value Name” dưới nhánh HKLM\SOFTWARE\bbb\cc\d
(nhánh trên phải có)

Dùng phương thức SetExpandedStringValue

Code: Select all

  1. Const HKEY_LOCAL_MACHINE = &H80000002
  2. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  3. strKeyPath = "SOFTWARE\bbb\cc\d"
  4. strValueName = "Expanded String Value Name"
  5. strValue = "%PATHEXT%"
  6.  
  7. objReg.SetExpandedStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue


D11- Code tạo một khóa định dạng REG_DWORD
Tạo khóa “Expanded String Value Name” dưới nhánh HKLM\SOFTWARE\bbb\cc

Dùng phương thức SetDWORDValue

Code: Select all

  1. Const HKEY_LOCAL_MACHINE = &H80000002
  2. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  3. strKeyPath = "SOFTWARE\bbb\cc"
  4. strValueName = "DWORD Value Name"
  5. dwValue = 82
  6.  
  7. objReg.SetDWORDValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, dwValue


D12- Code tạo một khóa định dạng REG_MULTI_SZ
Tạo khóa “Multi String Value Name” dưới nhánh HKLM\SOFTWARE\bbb\cc\d

Khai báo một mảng String và dùng phương thức SetMultiStringValue

Code: Select all

  1. Const HKEY_LOCAL_MACHINE = &H80000002
  2. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  3. strKeyPath = "SOFTWARE\bbb\cc\d"
  4. strValueName = "Multi String Value Name"
  5. arrStringValues = Array("first string", "second string", "third string", "fourth string")
  6.  
  7. objReg.SetMultiStringValue HKEY_LOCAL_MACHINE, strKeyPath, _
  8.     strValueName, arrStringValues

(Còn tiếp phần cuối: Xóa Registry)
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 519 times

Re: Hướng dẫn thao tác trên Registry

Postby truongphu » Wed 19/11/2008 3:44 pm

D13- Code tạo một khóa định dạng REG_BINARY
Tạo khóa “Binary Value Name” dưới nhánh HKLM\SOFTWARE\bbb\cc\d
Khai báo một mảng Số và dùng phương thức SetBinaryValue

Code: Select all

  1. Const HKEY_LOCAL_MACHINE = &H80000002
  2. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  3. strKeyPath = "SOFTWARE\bbb\cc\d"
  4. strValueName = "Binary Value Name"
  5. arrValues = Array(88, 205)
  6.  
  7. objReg.SetBinaryValue HKEY_LOCAL_MACHINE, strKeyPath, _
  8.     strValueName, arrValues


D14- Code Xóa khóa
Xóa tất cả các khóa vừa tạo ở trên dưới nhánh HKLM\SOFTWARE\bbb\cc\d
Dùng phương thức DeleteValue, tác dụng cho tất cả các khóa bất kể định dạng

Code: Select all

  1. Const HKEY_LOCAL_MACHINE = &H80000002
  2. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  3. strKeyPath = "SOFTWARE\bbb\cc\d"
  4. strMultiStringValueName = "Multi String Value Name"
  5. strExpandedStringValueName = "Expanded String Value Name"
  6. strBinaryValueName = "Binary Value Name"
  7.  
  8. objReg.DeleteValue HKEY_LOCAL_MACHINE, strKeyPath, strMultiStringValueName
  9. objReg.DeleteValue HKEY_LOCAL_MACHINE, strKeyPath, strExpandedStringValueName
  10. objReg.DeleteValue HKEY_LOCAL_MACHINE, strKeyPath, strBinaryValueName


D15- Xóa subkey cuối nhánh Registry
Trong chuỗi strKeyPath được khai báo, subkey cuối sẽ bị xóa nếu nó thực sự là subkey cuối cùng
Nếu không phải subkey cuối (nghĩa là còn mở ra subkey khác), phương thức xóa không tác dụng

Gọi phương thức DeleteKey để xóa subkey cuối cùng, bất kể subkey đó có chứa các giá trị hay không. Code sau xóa subkey cuối: ‘d’ không chứa khóa nào (đã xóa các khóa ở trên).

Code: Select all

  1. Const HKEY_LOCAL_MACHINE = &H80000002
  2. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  3. strKeyPath = "SOFTWARE\bbb\cc\d"
  4. objReg.DeleteKey HKEY_LOCAL_MACHINE, strKeyPath

 
Code sau đây không tác dụng vì ‘bbb’ chưa phải là subkey cuối, dưới nó còn ‘cc’

Code: Select all

  1. Const HKEY_LOCAL_MACHINE = &H80000002
  2. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  3. strKeyPath = "SOFTWARE\bbb\"
  4. objReg.DeleteKey HKEY_LOCAL_MACHINE, strKeyPath


Và như vậy, ta chịu khó xóa ngược lên nhánh thư mục: Code sau sẽ xóa subkey cuối, lần lượt: ‘cc’, ‘bbb’, ‘aaaa’. Lưu ý hai subkey ‘cc’ và ‘aaaa’ vẫn còn một khóa trong đó, vẫn bị xóa.

Code: Select all

  1. Const HKEY_LOCAL_MACHINE = &H80000002
  2. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  3. strKeyPath = "SOFTWARE\bbb\cc"
  4. objReg.DeleteKey HKEY_LOCAL_MACHINE, strKeyPath
  5. strKeyPath = "SOFTWARE\bbb"
  6. objReg.DeleteKey HKEY_LOCAL_MACHINE, strKeyPath
  7. strKeyPath = "SOFTWARE\aaaa"
  8. objReg.DeleteKey HKEY_LOCAL_MACHINE, strKeyPath


Ghi chú: Tôi đã test câu:

Code: Select all

  1. strKeyPath = "SOFTWARE\aaaa "
  2. objReg.DeleteKey HKEY_LOCAL_MACHINE, strKeyPath

Nhưng không sao xóa được subkey ‘aaaa’! Dò kỹ mới biết sau ‘aaaa‘ trong câu lệnh trên có một dấu cách!

E- Tóm tắt nội dung bài viết: (Giờ mới tóm tắt được..)

* Mục C- Khai báo đối tượng (object) để thao tác:

Code: Select all

  1. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")


Đọc Registry

* Mục D1- Code đọc các giá trị khóa: REG_SZ
Dùng phương thức GetStringValue
* Mục D2- Code đọc các giá trị khóa: REG_DWORD
Dùng phương thức GetDWORDValue
* Mục D3- Code đọc các giá trị khóa: REG_MULTI_SZ
Dùng phương thức GetMultiStringValue kèm vòng lặp For...Next
* Mục D4- Code đọc các giá trị khóa: REG_EXPAND_SZ
Dùng phương thức GetExpandedStringValue
* Mục D5- Code đọc các giá trị khóa: REG_BINARY
Dùng phương thức GetBinaryValue với vòng lặp For…Next
* Mục D6- Code đọc nhiều giá trị khóa
Gọi phương thức: EnumValues với vòng lặp For…Next
* Mục D7- Code liệt kê các Subkey
Dùng phương thức EnumKey và vòng lặp For…Next

Viết registry

* Mục D8- Code tạo một subkey
Dùng phương thức CreateKey
* Mục D9- Code tạo một khóa REG_SZ
Dùng phương thức SetStringValue
* Mục D10- Code tạo một khóa REG_EXPAND_SZ
Dùng phương thức SetExpandedStringValue
* Mục D11- Code tạo một khóa REG_DWORD
Dùng phương thức SetDWORDValue
* Mục D12- Code tạo một khóa REG_MULTI_SZ
Khai báo một mảng String và dùng phương thức SetMultiStringValue
* Mục D13- Code tạo một khóa REG_BINARY
Khai báo một mảng Số và dùng phương thức SetBinaryValue

Xóa Registry

* Mục D14- Code Xóa khóa
Dùng phương thức DeleteValue
* Mục D15- Xóa subkey cuối nhánh Registry
Gọi phương thức DeleteKey

Hy vọng với bài viết trên, thao tác với Registry không còn khó khăn với chúng ta nữa.
Phù ;)
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 519 times

Re: Hướng dẫn thao tác trên Registry

Postby truongphu » Wed 19/11/2008 7:41 pm

PHỤ LỤC: Tham Khảo thêm (tôi mới xem, chưa test !)
http://www.ddth.com/archive/index.php?t-202088.html
ngochoan2003 14-07-2008, 13:43

Các bạn cho mình hỏi là mình muốn tạo một form theo dõi sự thay đổi của Registry ( Xóa, tạo mới ...) thì làm như thế nào ?
Cụ thể :
Khi chương trình chạy nó sẽ theo dõi và kiểm tra Reg, nếu thấy có tác động thêm , xóa thì nó sẽ hiển thị thông báo cho mình biết.
Mong được sự giúp đỡ !


huytranaz 18-07-2008, 10:55
Bạn có thể sử dụng dịch vụ Active Scripting của Windows (WbemScripting.SWbemSink) để làm điều này. Xem qua các ví dụ sau nhé:

1. Theo dõi Entry events:

Code: Select all

  1. Set wmiServices = GetObject("winmgmts:" _
  2. & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
  3.  
  4. Set wmiSink = WScript.CreateObject("WbemScripting.SWbemSink", "SINK_")
  5.  
  6. wmiServices.ExecNotificationQueryAsync wmiSink, _
  7. "SELECT * FROM RegistryValueChangeEvent WHERE " & _
  8. "Hive='HKEY_LOCAL_MACHINE' AND " & _
  9. "KeyPath='SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion'" _
  10. & " AND ValueName='CSDVersion'"
  11.  
  12. WScript.Echo "Listening for Registry Change Events..." & vbCrLf
  13.  
  14. While(1)
  15. WScript.Sleep 1000
  16. Wend
  17.  
  18. Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
  19. WScript.Echo "Received Registry Change Event" & vbCrLf & _
  20. wmiObject.GetObjectText_()
  21. End Sub



2. Theo dõi Subkey events:

Code: Select all

  1. ' Monitor Registry Subkey Events
  2.  
  3. ' Windows Server 2003 : Yes
  4. ' Windows XP : Yes
  5. ' Windows 2000 : Yes
  6. ' Windows NT 4.0 : Yes
  7. ' Windows 98 : Yes
  8.  
  9. Set wmiServices = GetObject("winmgmts:" _
  10. & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\default")
  11.  
  12. Set wmiSink = WScript.CreateObject("WbemScripting.SWbemSink", "SINK_")
  13.  
  14. wmiServices.ExecNotificationQueryAsync wmiSink, _
  15. "SELECT * FROM RegistryKeyChangeEvent WHERE Hive='HKEY_LOCAL_MACHINE' " & _
  16. "AND KeyPath='SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion'"
  17.  
  18. WScript.Echo "Listening for Registry Change Events..." & vbCrLf
  19.  
  20. While(1)
  21. WScript.Sleep 1000
  22. Wend
  23.  
  24. Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
  25. WScript.Echo "Received Registry Change Event" & vbCrLf & _
  26. wmiObject.GetObjectText_()
  27. End Sub


3. Theo dõi subtree events:

Code: Select all

  1. ' Monitor Registry Subtree Events
  2.  
  3. ' Windows Server 2003 : Yes
  4. ' Windows XP : Yes
  5. ' Windows 2000 : Yes
  6. ' Windows NT 4.0 : Yes
  7. ' Windows 98 : Yes
  8.  
  9. Set wmiServices = GetObject("winmgmts:" _
  10. & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\default")
  11.  
  12. Set wmiSink = WScript.CreateObject("WbemScripting.SWbemSink", "SINK_")
  13.  
  14. wmiServices.ExecNotificationQueryAsync wmiSink, _
  15. "SELECT * FROM RegistryTreeChangeEvent WHERE Hive= " _
  16. & "'HKEY_LOCAL_MACHINE' AND RootPath=''"
  17.  
  18.  
  19. WScript.Echo "Listening for Registry Change Events..." & vbCrLf
  20.  
  21. While(1)
  22. WScript.Sleep 1000
  23. Wend
  24.  
  25. Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
  26. WScript.Echo "Received Registry Change Event" & vbCrLf & _
  27. wmiObject.GetObjectText_()
  28. End Sub


Chúc vui,

ngochoan2006 19-07-2008, 16:00
Tôi thử không được. bạn có thể viết thành 1 Project được không ?

huytranaz 19-07-2008, 17:51
Code ở trên là code mẫu viết bằng vb script.
Mình không upload được, bạn làm như sau nhé:

Bước 1: Bạn tạo 1 project mới trong vb. Sau đó vào menu Project -> Refference. Tìm: Microsoft WMI Scripting Vx.x Library (trong đó Vx.x là phiên bản của thư viện WMI).

Bước 2: Dán đoạn code sau vào form
Lưu ý:
- Chương trình theo dõi sự thay đổi ở nhánh registry: HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run . Bạn có thể sửa lại theo ý.

- Chương trình sẽ thông báo bằng cách in ra màn hình watch của IDE, bạn có thể sửa lại theo ý mình.


Code: Select all

  1. Option Explicit
  2. Dim wmiServices As Object
  3. Dim WithEvents wmiSink As WbemScripting.SWbemSink
  4. '--
  5. '--
  6. Private Sub Form_Load()
  7.  
  8. Set wmiServices = GetObject("winmgmts:" _
  9. & "{impersonationLevel=impersonate}!\\.\root\default")
  10.  
  11. Set wmiSink = CreateObject("WbemScripting.SWbemSink", "")
  12.  
  13. wmiServices.ExecNotificationQueryAsync wmiSink, _
  14. "SELECT * FROM RegistryKeyChangeEvent WHERE Hive='HKEY_LOCAL_MACHINE' " & _
  15. "AND KeyPath='SOFTWARE\\Microsoft\\Windows\\CurrentVers ion\\Run'"
  16.  
  17. Debug.Print "Listening for Registry Change Events..." & vbCrLf
  18.  
  19. End Sub
  20.  
  21. Private Sub wmiSink_OnCompleted(ByVal iHResult As WbemScripting.WbemErrorEnum, ByVal objWbemErrorObject As WbemScripting.ISWbemObject, ByVal objWbemAsyncContext As WbemScripting.ISWbemNamedValueSet)
  22. Debug.Print "Sink completed!"
  23. End Sub
  24.  
  25. Private Sub wmiSink_OnObjectPut(ByVal objWbemObjectPath As WbemScripting.ISWbemObjectPath, ByVal objWbemAsyncContext As WbemScripting.ISWbemNamedValueSet)
  26. Debug.Print "Object put!"
  27. End Sub
  28.  
  29. Private Sub wmiSink_OnObjectReady(ByVal objWbemObject As WbemScripting.ISWbemObject, ByVal objWbemAsyncContext As WbemScripting.ISWbemNamedValueSet)
  30. Debug.Print "Change event!" & objWbemObject.GetObjectText_()
  31. End Sub
  32.  
  33. Private Sub wmiSink_OnProgress(ByVal iUpperBound As Long, ByVal iCurrent As Long, ByVal strMessage As String, ByVal objWbemAsyncContext As WbemScripting.ISWbemNamedValueSet)
  34. Debug.Print "Progress: " & iCurrent & "/"; iUpperBound & ": " & strMessage
  35. End Sub

Chúc cuối tuần vui vẻ,

Trên đây là toàn văn nội dung trang web. các bạn cứ tham khảo và trao đổi. Đề tài cũng hay đấy chứ!
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 519 times

Re: Hướng dẫn thao tác trên Registry

Postby truongphu » Fri 21/11/2008 2:51 pm

Có bạn hỏi "Làm sao dùng code để biết định dạng rất nhiều khóa trong một strKeyPath?"
Câu hỏi hay, xin bổ sung vào bài viết
D16- Code đọc định dạng của các khóa trong một đường dẫn
Đọc định dạng tất cả các khóa của nhánh "HKLM\SYSTEM\CurrentControlSet\Control\Lsa". Đây là nhánh có nhiều định dạng khóa
a- Dùng phương thức EnumValues để tạo các tên khóa và giá trị đi kèm vào 2 mảng arrValueNames, arrValueTypes. (Như mục D6- Code đọc nhiều giá trị khóa).
b- Dùng vòng lặp For..Next để đọc từng giá trị khóa, phân tách từng trường hợp của arrValueTypes

Code: Select all

  1. Const HKEY_LOCAL_MACHINE = &H80000002
  2. Const REG_SZ = 1
  3. Const REG_EXPAND_SZ = 2
  4. Const REG_BINARY = 3
  5. Const REG_DWORD = 4
  6. Const REG_MULTI_SZ = 7
  7.  
  8. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  9.  
  10. strKeyPath = "SYSTEM\CurrentControlSet\Control\Lsa"
  11.  
  12. objReg.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes
  13.  
  14. For i = 0 To UBound(arrValueNames)
  15.     a = a & "Value Name: " & arrValueNames(i)
  16.    
  17.     Select Case arrValueTypes(i)
  18.         Case REG_SZ
  19.             a = a & vbTab & "Data Type: String" & vbCr
  20.  
  21.         Case REG_EXPAND_SZ
  22.             a = a & vbTab & "Data Type: Expanded String" & vbCr
  23.  
  24.         Case REG_BINARY
  25.             a = a & vbTab & "Data Type: Binary" & vbCr
  26.  
  27.         Case REG_DWORD
  28.             a = a & vbTab & "Data Type: DWORD" & vbCr
  29.  
  30.         Case REG_MULTI_SZ
  31.             a = a & vbTab & "Data Type: Multi String" & vbCr
  32.  
  33.     End Select
  34. Next
  35. MsgBox a
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 519 times

Re: Hướng dẫn thao tác trên Registry

Postby truongphu » Sat 22/11/2008 11:45 am

Bổ sung
D17- Một khóa có tồn tại hay không?
Ít dùng vì Script WMI không báo lỗi nếu thiếu đối số, khác với script Shell
Dùng phương thức GetStringValue và kiểm tra giá trị thu nhận.
Kiểm tra giá trị của khóa DNS Server trong NetWorking có tồn tại hay không:

Code: Select all

  1. Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
  2. strKeyPath = "SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{1CD45787-B794-487F-AC99-414A4479C570}"
  3. strValueName = "NameServer"
  4. objReg.GetStringValue &H80000002, strKeyPath, strValueName, strValue
  5. If IsNull(strValue) Then MsgBox "Khóa không có" Else MsgBox "Khóa có"
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
thuongall
Quản trị
Quản trị
Posts: 456
Joined: Wed 26/01/2005 8:05 am
Location: Quê hương Đồng Khởi
Been thanked: 9 times
Contact:

Re: Hướng dẫn thao tác trên Registry

Postby thuongall » Thu 21/05/2009 4:24 pm

Cái WMI này thấy có vấn đề, EnumValues quên mất cái Default Value đi thì phải và làm thế nào để Get cái Default Value này vậy ta? Bác truongphu viết tiếp nhé! :D

PhuongThanh37
Thành viên năng nổ
Thành viên năng nổ
Posts: 87
Joined: Fri 09/09/2005 1:38 pm
Location: Liên Hà, Đông Anh, HN
Contact:

Re: Hướng dẫn thao tác trên Registry

Postby PhuongThanh37 » Mon 08/06/2009 11:33 pm

truongphu wrote:...Trong bài “Registry với VBS” http://caulacbovb.com/forum/viewtopic.php?f=30&t=2145&start=0&st=0&sk=t&sd=a
...Tuy nhiên nhược điểm của Script Shell là chỉ thao tác với các giá trị của khóa có định dạng là String: REG_SZ. Các định dạng của khóa khác tôi cố tìm hiểu nhưng đến giờ vẫn chưa gặp! ...

Cháu đọc trong bài topic 2145 kia và ở đâu cũng đều có thấy là RegWrite(Nam, Value, [Type])
Vậy sao lại là chỉ làm thao tác với định dạng REG_SZ?
Với lại câu chú nói "Các định dạng của khóa khác tôi cố tìm hiểu nhưng đến giờ vẫn chưa gặp!" hi hi nghĩa là chú chưa search thấy ai dùng hả chú
Uống Chanh & nghe Chanh hát

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 519 times

Re: Hướng dẫn thao tác trên Registry

Postby truongphu » Tue 09/06/2009 5:18 am

PhuongThanh37 wrote:Với lại câu chú nói "Các định dạng của khóa khác tôi cố tìm hiểu nhưng đến giờ vẫn chưa gặp!" hi hi nghĩa là chú chưa search thấy ai dùng hả chú


Tôi viết bài nầy năm ngoái
Hồi đó tìm hiểu các hàm RegWrite và RegRead tôi thấy nó nghèo nàn quá, không chú tâm lắm thành ra câu nói trên là không đúng
Bổ sung bài của Microsoft

http://msdn.microsoft.com/en-us/library/yfdfhz1b.aspx

RegWrite Method

Creates a new key, adds another value-name to an existing key (and assigns it a value), or changes the value of an existing value-name.

Code: Select all

  1. object.RegWrite(strName, anyValue [,strType])


Arguments
object
WshShell object.

strName
String value indicating the key-name, value-name, or value you want to create, add, or change.

anyValue
The name of the new key you want to create, the name of the value you want to add to an existing key, or the new value you want to assign to an existing value-name.

strType
Optional. String value indicating the value's data type.

(REG_SZ , REG_EXPAND_SZ, REG_DWORD, REG_BINARY.)

(Note:The REG_MULTI_SZ type is not supported for the RegWrite method.
RegWrite will write at most one DWORD to a REG_BINARY value. Larger values are not supported with this method)


Example
The following code creates a key and two values, reads them, and deletes them.

Code: Select all

  1. Dim WshShell, bKey
  2. Set WshShell = WScript.CreateObject("WScript.Shell")
  3.  
  4. WshShell. RegWrite"HKCU\Software\ACME\FortuneTeller\", 1, "REG_BINARY"
  5. WshShell. RegWrite"HKCU\Software\ACME\FortuneTeller\MindReader", "Goocher!", "REG_SZ"
  6.  
  7. bKey = WshShell.RegRead("HKCU\Software\ACME\FortuneTeller\")
  8. WScript.Echo WshShell.RegRead("HKCU\Software\ACME\FortuneTeller\MindReader")
  9.  
  10. WshShell.RegDelete "HKCU\Software\ACME\FortuneTeller\MindReader"
  11. WshShell.RegDelete "HKCU\Software\ACME\FortuneTeller\"
  12. WshShell.RegDelete "HKCU\Software\ACME\"
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
thuongall
Quản trị
Quản trị
Posts: 456
Joined: Wed 26/01/2005 8:05 am
Location: Quê hương Đồng Khởi
Been thanked: 9 times
Contact:

Re: Hướng dẫn thao tác trên Registry

Postby thuongall » Tue 09/06/2009 10:52 am

truongphu wrote:Kiếm Default Value ở đâu vậy ta?

Ý của cháu là giá trị trong khung màu đỏ đấy. EnumValues "quên" nó rồi thì phải. :(

default.png

User avatar
thuongall
Quản trị
Quản trị
Posts: 456
Joined: Wed 26/01/2005 8:05 am
Location: Quê hương Đồng Khởi
Been thanked: 9 times
Contact:

Re: Hướng dẫn thao tác trên Registry

Postby thuongall » Sat 13/06/2009 11:59 am

Hôm nay mới đọc lại chủ đề này. Có gì đâu mà bác sợ chứ, sao cháu dám đùa vui với bác chứ. :D Thật ra thì giá trị default ít khi sử dụng và vì thế nên thằng Script WMI "quên" nó luôn chăng (bug của Script WMI?)
Còn với Script Shell thì lấy giá trị default đơn giản thế này:

Code: Select all

  1. MsgBox WshShell.RegRead("HKCU\Control Panel\Cursors\")

Với API hình như cũng tương tự, còn Script WMI thì không được.

Duong_Act
Thành viên chính thức
Thành viên chính thức
Posts: 12
Joined: Fri 03/06/2011 7:31 am
Has thanked: 4 times

Re: Hướng dẫn xử lý Registry trong VB6

Postby Duong_Act » Sat 02/07/2011 6:15 am

Em thao tác trên registry với WScript.Shell và winmgmts
Khá là khó chịu khi một số thằng Antivirus nó cứ xơi béng File của em do báo là TrojanVB :|
Em nghĩ chắc là nó giống với đoạn code mấy thằng virus hay dùng , các bác có cách sử lý nào không hơn nữa là các bác có cách nào chống dịch mã VB không chứ em không thích file của mình bị phanh thây moi ruột dễ dàng như bình thường được :((
Các bác cố giúp ! Thank các bác

User avatar
VuVanHoanh
Thành viên danh dự
Thành viên danh dự
Posts: 1259
Joined: Thu 03/06/2010 9:23 pm
Location: Kim Sơn - Đông Triều - Quảng Ninh
Has thanked: 22 times
Been thanked: 138 times
Contact:

Re: Hướng dẫn xử lý Registry trong VB6

Postby VuVanHoanh » Sat 02/07/2011 9:06 am

Chống dịch ngược mã VB6 đã có bàn nhiều nhưng hình như chẳng ai có cách giải quyết cả.
Còn về vụ virus, bạn thử kiểm tra xem máy bạn có dính virus không? Sợ nó cắn vào file của bạn luôn đó.
Since 2008...
One love! :x

neods
Thành viên chính thức
Thành viên chính thức
Posts: 12
Joined: Sun 03/07/2011 11:45 am

Re: Hướng dẫn xử lý Registry trong VB6

Postby neods » Sun 17/07/2011 7:21 pm

Sử dụng SaveSetting thì key mới sẽ đc tạo ở HKEY_Current_User\Software\Vb and VBa Program Setting\Vblib vậy em muốn nó đổi sang HKEY_LOCAL_MACHINE/S​OFTWARE chẳng hạn thì làm như thế nào ạ :(?
Em đã thử SaveSetting appname:="HKEY_LOCAL_MACHINE/S​OFTWARE", section:="test", Key:="test", setting:=(Text1.Text)
nhưng kết quả thì nó vẫn ko thay đổi vị trí. Các bác giúp e với.
Tiện cho em hỏi, em muốn sử dụng Check_Click() để show một frame(trước khi tick vẫn bị ẩn) nằm trên cùng một form có đc ko?
Thank các bác nhiều.

hackerga
Posts: 1
Joined: Thu 14/07/2011 7:18 am
Has thanked: 1 time

Re: Hướng dẫn xử lý Registry trong VB6

Postby hackerga » Thu 21/07/2011 10:25 pm

Làm sao để lấy thông tin đưa ra cho mọi người thấy nhỉ?

Ai làm với ví dụ này tôi xem với.'

Cám ơn!
http://www.mediafire.com/?87e45b0q52kdug7

Koha JeseMen
Thành viên chính thức
Thành viên chính thức
Posts: 24
Joined: Tue 27/07/2010 9:00 pm
Has thanked: 5 times

Re: Hướng dẫn xử lý Registry trong VB6

Postby Koha JeseMen » Tue 09/08/2011 1:08 pm

Nhìn Register đơn giản thế mà lên lập trình ngoằn ngoèo quá :(
Hay tại mấy u viết quá rườm rà :D
Xem xong muốn á khẩu luôn @@ :D


Return to “[VB] Bài viết hướng dẫn”

Who is online

Users browsing this forum: No registered users and 0 guests