• 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

Làm việc với Registry

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
Hình đại diện của người dùng
tuyen_dt18
Guru
Guru
Bài viết: 256
Ngày tham gia: T.Bảy 19/04/2008 8:46 pm
Đến từ: Hưng Yên
Been thanked: 43 time
Liên hệ:

Làm việc với Registry

Gửi bàigửi bởi tuyen_dt18 » T.Sáu 19/11/2010 3:45 pm

Tên bài viết: Làm việc với Registry
Tác giả: tuyen_dt18
Cấp độ bài viết: Chưa đánh giá
Tóm tắt: Thao tác với Registry như : Lấy dữ liệu, lưu dữ liệu, xóa dữ liệu trong Registry



Giới thiệu :
Các khóa chính trong Registry :
HKEY_CLASSES_ROOT = &H80000000
HKEY_CURRENT_CONFIG = &H80000005
HKEY_CURRENT_USER = &H80000001
HKEY_LOCAL_MACHINE = &H80000002
HKEY_USERS = &H80000003


Các kiểu dữ liệu lưu trong Registry:
REG_NONE = 0 'Không có kiểu
REG_SZ = 1 'Chuỗi Unicode kết thúc với ký tự Null
REG_EXPAND_SZ = 2 'Chuỗi Unicode kết thúc với ký tự Null
REG_BINARY = 3 'Nhị phân - Mảng các Byte
REG_DWORD = 4 'Số 32 Bit
REG_DWORD_BIG_ENDIAN = 5 'Số 32 Bit
REG_LINK = 6 'Symbolic Link (unicode)
REG_MULTI_SZ = 7 'Đa chuỗi Unicode

Các hàm API cần thiết :
1. Private Declare Function RegOpenKeyW Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpSubKey As Long, ByRef phkResult As Long) As Long
Chức năng : Mở một khóa trong Registry để thao tác nếu tồn tại. Nếu không tồn tại hàm sẽ thất bại
- hKey : (Vào) Chỉ định một khóa chính của Registry. Ví dụ : HKEY_XXX.
- lpSubKey : (Vào) Địa chỉ của chuỗi đường dẫn tới khóa con. Ví dụ : StrPtr("Software\Microsoft\xxx").
- phkResult : (Ra) Biến nhận giá trị Handle của khóa nếu mở thành công.
Giá trị trả về : hàm này trả về ERROR_SUCCESS( bằng 0) nếu thành công, khác không nếu thất bại.
Nếu thành công, biến phkResult sẽ nhận giá trị là Handle của khóa được mở.

2. Private Declare Function RegCreateKeyW Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpSubKey As Long, ByRef phkResult As Long) As Long
Chức năng : Mở một khóa trong Registry để thao tác nếu tồn tại, nếu không tồn tại sẽ tạo mới.
- Các tham số và giá trị trả về tương tự như hàm "RegOpenKeyW".

3. Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Chức năng : Đóng khóa chỉ định.
- hKey : (Vào) Chỉ định một khóa chính hoặc một Handle của khóa cần đóng.
Giá trị trả về : Hàm trả về ERROR_SUCCESS (=0) nếu thành công, nếu thất bại sẽ trả về khác 0.
4. Private Declare Function RegFlushKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Các tham số và giá trị trả về cũng giống với hàm RegCloseKey, chỉ khác là hàm này sẽ chờ đến khi dữ liệu hoàn toàn được ghi vào Registry mới trả về.
5. Private Declare Function RegQueryValueExW Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpValueName As Long, ByVal lpReserved As Long, ByRef lpType As Long, ByRef lpData As Any, ByRef lpcbData As Long) As Long
Chức năng : Lấy về dữ liệu, kiểu dữ liệu, kích thước của dữ liệu của một giá trị khóa đã mở.
- hKey (Vào) Chỉ định một khóa chính (HKEY_XXX) hoặc một Handle của khóa đã mở bởi các hàm RegOpenKeyW, RegCreateKeyW,...
- lpValueName : (Vào) Địa chỉ của chuỗi Giá trị (Value Name) của khóa cần mở. Nếu giá trị này=0, hàm sẽ đọc giá trị mặc định (Default) của khóa chỉ định.
- lpReserved : Chưa sử dụng. Để =0.
- lpType : (Ra) Biến nhận về kiểu dữ liệu của giá trị của khóa chỉ định(REG_NONE,REG_SZ,REG_XXX). Có thể đặt=0 nếu không cần. Nếu cần lấy về dữ liệu, ta phải căn cứ vào giá trị này để chỉ định bộ đệm nhận dữ liệu cho phù hợp. Ví dụ nếu giá trị này =REG_SZ ta sẽ chỉ định bộ đệm là một chuỗi, nếu=REG_BINARY ta chỉ định bộ đệm là một mảng các Byte, nếu =REG_DWORD ta chỉ định bộ đệm là một số 32 bit,...
- lpData : Chỉ định bộ đệm nhận về dữ liệu. Bộ đệm cần có kích thước đủ lớn để chứa dữ liệu. Để biết chính xác kích thước cần thiết ta gọi hàm này một lần với giá trị lpData=0 và gán biến nhận về kích thước (theo Bye) yêu cầu cho tham số lpcbData. Sau đó tùy theo giá trị của tham số lpType mà ta chỉ định bộ đệm. Ví dụ nếu lpType=REG_SZ ta khởi tạo bộ đệm như sau : Bộ đệm=String(lpcbData/2,vbNullchar), nếu lpType=REG_BINARY ta khởi tạo bộ đệm như sau : ReDim Bộ đệm (0 To lpcbData-1) [As Byte],... Để nhận về dữ liệu kiểu chuỗi ta chỉ định là ByVal StrPtr(Chuỗi bộ đệm), với Mảng Byte là ByVal VarPtr(Mảng bộ đệm (chỉ số đầu tiên)), với 1 số ta không dùng ByVal và chỉ định bộ đệm là một số.
- lpcbData : (Vào/Ra) : Nhận về hoặc chỉ định kích thước của bộ đệm dữ liệu. Đặt=0 nếu không cần thiết. Tuy nhiên nếu lấy dữ liệu ta cần chỉ định giá trị này.
Giá trị trả về : ERROR_SUCCESS (=0) nếu thành công, khác 0 nếu thất bại.

6. Private Declare Function RegSetValueExW Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpValueName As Long, ByVal Reserved As Long, ByVal dwType As Long, ByRef lpData As Any, ByVal cbData As Long) As Long
Chức năng : Lưu dữ liệu vào một Giá trị của một khóa trong Registry chỉ định.
- hKey (Vào) : Chỉ định một khóa chính(HKEY_XXX) hoặc một Handle của khóa đã mở bởi các hàm RegOpenKeyW, RegCreateKeyW,...
- lpValueName : (Vào) Chỉ định địa chỉ của chuỗi giá trị(Value Name) của khóa cần ghi.
- Reserved : Không sử dụn. Đặt=0
- dwType : Chỉ định kiểu dữ liệu sẽ ghi (REG_NONE,REG_SZ,...)
- lpData : (Vào) chỉ định bộ đệm dữ liệu để ghi. Với kiểu chuỗi sử dụng Byval StrPtr(chuỗi), với kiểu Nhị phân sử dụng Byval VarPtr(Mảng(chỉ số đầu tiên)), với số không dùng ByVal.
- cbData : (Vào) Chỉ định kích thước bộ đệm dữ liệu sẽ ghi.
Giá trị trả về : ERROR_SUCCESS(=0) nếu thành công, khác 0 nếu thất bại.

7. Private Declare Function RegDeleteValueW Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpValueName As Long) As Long
Chức năng : Xóa dữ liệu của một giá trị(Value Name) của khóa chỉ định.
- hKey (Vào) Chỉ định một khóa chính (HKEY_XXX) hoặc một Handle của khóa đã mở bởi các hàm RegOpenKeyW,RegCreateKeyW,...
- lpValueName : (Vào) Chỉ định địa chỉ của giá trị cần xóa dữ liệu. Ví dụ : StrPtr("ABC").
8. Private Declare Function RegDeleteKeyW Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpSubKey As Long) As Long
Chức năng : Xóa một khóa và tất cả các giá trị của một khóa.
- hKey : (Vào) Chỉ định một khóa chính (HKEY_XX) hoặc một Handle của khóa đã mở bởi các hàm RegOpenKeyW, RegCreateKeyW,...
- lpSubKey : (Vào) Chỉ định địa chỉ của chuỗi khóa cần xóa.
Giá trị trả về : ERROR_SUCCESS(=0) nếu thành công, khác 0 nếu thất bại.

Chú ý : Trong một số trường hợp các hàm có thể thất bại nếu như các khóa chỉ định đang bị chương trình khác khóa hoặc đang thao tác. Và trong tất cả các trường hợp thì không thể xóa, sửa được các khóa chính(HKEY_XXX).

Xây dựng các hàm :
  1. 'Khai báo :
  2. '========== FUNCTIONS   ====================================================
  3. Private Declare Function RegOpenKeyW Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpSubKey As Long, ByRef phkResult As Long) As Long
  4. Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
  5. Private Declare Function RegCreateKeyW Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpSubKey As Long, ByRef phkResult As Long) As Long
  6. Private Declare Function RegDeleteKeyW Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpSubKey As Long) As Long
  7. Private Declare Function RegDeleteValueW Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpValueName As Long) As Long
  8. Private Declare Function RegFlushKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
  9. Private Declare Function RegQueryValueExW Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpValueName As Long, ByVal lpReserved As Long, ByRef lpType As Long, ByRef lpData As Any, ByRef lpcbData As Long) As Long
  10. Private Declare Function RegSetValueExW Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpValueName As Long, ByVal Reserved As Long, ByVal dwType As Long, ByRef lpData As Any, ByVal cbData As Long) As Long
  11.  
  12. '========== CONSTANTS   ====================================================
  13. Private Const ERROR_SUCCESS As Long = 0&
  14.  
  15. '========== TYPES       ====================================================
  16.  
  17. '========== ENUMES      ====================================================
  18. Public Enum REGISTRY_KEYS
  19.     HKEY_CLASSES_ROOT = &H80000000
  20.     HKEY_CURRENT_CONFIG = &H80000005
  21.     HKEY_CURRENT_USER = &H80000001
  22.     HKEY_LOCAL_MACHINE = &H80000002
  23.     HKEY_USERS = &H80000003
  24. End Enum
  25. '
  26. Public Enum REGISTRY_DATA_TYPES
  27.     REG_NONE = 0
  28.     REG_SZ = 1
  29.     REG_EXPAND_SZ = 2
  30.     REG_BINARY = 3
  31.     REG_DWORD = 4
  32.     REG_DWORD_BIG_ENDIAN = 5
  33.     REG_LINK = 6
  34.     REG_MULTI_SZ = 7
  35. End Enum
  36. 'Các hàm :
  37. '--------------------------------------------------------------------------
  38. 'Xóa dữ liệu
  39. Public Function RegistryDelete(Optional ByVal hKey As REGISTRY_KEYS = HKEY_CURRENT_USER, Optional ByVal szSubkey As String = "", Optional ByVal szValueName As String = "", Optional bDeleteKey As Boolean = False) As Boolean
  40. On Error GoTo UnSuccess
  41.     Dim Ret As Long, lphKey As Long
  42.     Ret = RegOpenKeyW(hKey, StrPtr(szSubkey), lphKey)
  43.     If Ret <> ERROR_SUCCESS Then Exit Function
  44.     If bDeleteKey Then
  45.         Ret = RegDeleteKeyW(hKey, StrPtr(szSubkey))
  46.     Else
  47.         Ret = RegDeleteValueW(lphKey, StrPtr(szValueName))
  48.     End If
  49.     If Ret <> ERROR_SUCCESS Then GoTo UnSuccess
  50.     If lphKey <> 0 Then Ret = RegCloseKey(lphKey)
  51.     RegistryDelete = True
  52.     Exit Function
  53. UnSuccess:
  54.     If lphKey <> 0 Then Ret = RegCloseKey(lphKey)
  55.     RegistryDelete = False
  56. End Function
  57. 'Ghi dữ liệu
  58. Public Function RegistrySet(Optional ByVal hKey As REGISTRY_KEYS = HKEY_CURRENT_USER, Optional ByVal szSubkey As String = "", Optional ByVal szValueName As String = "", Optional ByVal dwDataType As REGISTRY_DATA_TYPES = REG_SZ, Optional ByVal anyData As Variant) As Boolean
  59. On Error GoTo UnSuccess
  60.     Dim Ret As Long, lphKey As Long, lpString As String, lpLong As Long
  61.     Ret = RegCreateKeyW(hKey, StrPtr(szSubkey), lphKey)
  62.     If Ret <> ERROR_SUCCESS Then Exit Function
  63.     Select Case dwDataType
  64.         Case REG_EXPAND_SZ, REG_MULTI_SZ, REG_SZ
  65.             lpString = CStr(anyData) & vbNullChar
  66.             Ret = RegSetValueExW(lphKey, StrPtr(szValueName), 0&, dwDataType, ByVal StrPtr(lpString), LenB(lpString))
  67.         Case REG_BINARY
  68.             Ret = RegSetValueExW(lphKey, StrPtr(szValueName), 0&, dwDataType, ByVal VarPtr(anyData(0)), UBound(anyData) - LBound(anyData) + 1)
  69.         Case Else
  70.             lpLong = CLng(Val(anyData))
  71.             Ret = RegSetValueExW(lphKey, StrPtr(szValueName), 0&, dwDataType, lpLong, Len(lpLong))
  72.     End Select
  73.     If Ret <> ERROR_SUCCESS Then GoTo UnSuccess
  74.     Ret = RegFlushKey(lphKey)
  75.     If lphKey <> 0 Then Ret = RegCloseKey(lphKey)
  76.     RegistrySet = True
  77.     Exit Function
  78. UnSuccess:
  79.     If lphKey <> 0 Then Ret = RegCloseKey(lphKey)
  80.     RegistrySet = False
  81. End Function
  82. ' Đọc dữ liệu
  83. Public Function RegistryGet(Optional ByVal hKey As REGISTRY_KEYS = HKEY_CURRENT_USER, Optional ByVal szSubkey As String = "Software\Microsoft\Windows\CurrentVersion\Run", Optional ByVal szValueName As String = "", Optional ByRef lpDataType As Long)
  84. On Error GoTo UnSuccess
  85.     Dim Ret As Long, lphKey As Long, lpType As Long, lpString As String, lpLong As Long, lpBinary() As Byte, lpDataLen As Long
  86.     Ret = RegOpenKeyW(hKey, StrPtr(szSubkey), lphKey)
  87.     If Ret <> ERROR_SUCCESS Then Exit Function
  88.     Ret = RegQueryValueExW(lphKey, StrPtr(szValueName), 0&, lpType, ByVal 0&, lpDataLen)
  89.     Select Case lpType
  90.         Case REG_EXPAND_SZ, REG_MULTI_SZ, REG_SZ
  91.             lpString = String$(lpDataLen + 1, vbNullChar)
  92.             Ret = RegQueryValueExW(lphKey, StrPtr(szValueName), 0&, 0&, ByVal StrPtr(lpString), Len(lpString))
  93.             If Ret <> ERROR_SUCCESS Then GoTo UnSuccess
  94.             Ret = InStr(lpString, vbNullChar)
  95.             RegistryGet = Left$(lpString, (lpDataLen / 2) - 1)
  96.         Case REG_BINARY
  97.             ReDim lpBinary(0 To lpDataLen - 1)
  98.             Ret = RegQueryValueExW(lphKey, StrPtr(szValueName), 0&, 0&, ByVal VarPtr(lpBinary(0)), lpDataLen)
  99.             If Ret <> ERROR_SUCCESS Then GoTo UnSuccess
  100.             RegistryGet = lpBinary
  101.         Case Else
  102.             Ret = RegQueryValueExW(lphKey, StrPtr(szValueName), 0&, 0&, lpLong, Len(lpLong))
  103.             If Ret <> ERROR_SUCCESS Then GoTo UnSuccess
  104.             RegistryGet = lpLong
  105.     End Select
  106.     lpDataType = lpType
  107.     If lphKey <> 0 Then Ret = RegCloseKey(lphKey)
  108.     Exit Function
  109. UnSuccess:
  110. If lphKey <> 0 Then Ret = RegCloseKey(lphKey)
  111. RegistryGet = Empty
  112. End Function
  113.  
  114.  

Mã nguồn chương trình Demo :
Registry.rar
Các thao tác cơ bản với Registry
(3.67 KiB) Đã tải 718 lần


Hỏi ý kiến tác giả trước khi sử dụng hoặc trích dẫn rõ nguồn bài viết khi sử dụng.

Hình đại diện của người dùng
Tkkk_Vnn
Thành viên tích cực
Thành viên tích cực
Bài viết: 143
Ngày tham gia: T.Sáu 23/04/2010 4:18 pm
Đến từ: Yên Bái-Việt Nam
Been thanked: 1 time

Re: Làm việc với Registry

Gửi bàigửi bởi Tkkk_Vnn » T.Ba 23/11/2010 7:12 pm

Bạn Tuyen_dt8 dạo này có đóng góp rất nhiều cho 4rum đấy , bạn thật là giỏi (theo mình nghĩ ) !
À mà hôm nọ mới coi thông tin về bạn thấy bạn là SV CNTT hôm nay đã thấy thất nghiệp , chắc tại mới ra trường hả ? Ở VN là vậy đó ra trường là thất nghiệp luôn bởi học trong trường một đằng ra ngoài lại làm một nẻo , đành vậy !
Chúc bạn may mắn tìm được việc nha !


Quay về “[VB] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.0 khách