Làm th? nào đ? s? d?ng Registry API đ? lưu và l?y các thi?t đ?t

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 145679 - Xem s?n ph?m mà bài này áp d?ng vào.
Bung t?t c? | Thu g?n t?t c?

? Trang này

TÓM T?T

M?c dù Visual Basic bao g?m các ch?c năng SaveSetting và GetSetting đ? lưu và truy xu?t thông tin t? s? đăng k?, các ch?c năng này ch? ho?t đ?ng trên m?t ph?n c? th? c?a registry, Visual Basic và VBA Cài đ?t chương tr?nh HKEY_CURRENT_USER g?c phím.

Bài vi?t này v?ch ra s? d?ng 32-bit Windows API ch?c năng, mà có th? đư?c s? d?ng đ? đ?t và l?y giá tr? t? b?t c? nơi nào trong s? đăng k?. Các ch? đ? và tài li?u tham kh?o ch?c năng trong bài vi?t này có th? đư?c t?ng quát hóa chương tr?nh các đăng k? 16-bit.

Ch?c năng API 32-bit c?ng bao g?m h? tr? cho an ninh, m?c dù m?t T?ng quan v? an ninh n?m ngoài ph?m vi c?a bài vi?t này.

Lưu ?: Các ch?c năng SaveSetting và GetSetting không ph?i là m?t ph?n c?a VBA ch?c năng thư vi?n. Tuy nhiên, m?u m? dư?i đây v?n c?n áp d?ng cho 32-bit các ?ng d?ng th?c hi?n VBA.

THÔNG TIN THÊM

Thông tin đăng k? chung

Cơ quan đăng k? đư?c s? d?ng b?i các ?ng d?ng và Windows đ? lưu tr? các c?u h?nh d? li?u. Đó là m?t thay th? cho nh?ng con s? l?n c?a INI t?p tin mà proliferated trên Windows 3.x máy và c?ng đư?c s? d?ng r?t nhi?u b?i OLE.

Cơ quan đăng k? đư?c t? ch?c b?ng cách s? d?ng m?t lo?t th? b?c các phím và các giá tr? gi?ng như m?t cây. Mo?i phím, b?t đ?u v?i m?t trong s? sáu g?c đư?c xác đ?nh trư?c phím, có th? có sub-keys và các giá tr? liên k?t v?i nó. Các phím t? ch?c và đ?t tên đơn v? và xu?t hi?n trong Windows Registry Editor như t?p tin thư m?c. Các giá tr? d? li?u m?c và xu?t hi?n dư?i d?ng văn b?n m?c trong các c?a s? bên ph?i c?a c?a s? Registry Editor. Phím c?n không có b?t k? liên k?t các giá tr?, nhưng có th? có nhi?u ngư?i. M?i giá tr? có m?t ki?u d? li?u liên quan. Hai lo?i d? li?u đăng k? thông d?ng nh?t là REG_SZ, m?t null ch?m d?t chu?i; và REG_DWORD, m?t s? 32-bit.

Quá tr?nh cơ b?n đư?c s? d?ng đ? vi?t ho?c đ?c t? m?t v? trí trong registry là Chúc b?n như v?y. Đ? tham kh?o b?t k? ch?a khóa cho trư?c ho?c giá tr?, b?n ph?i có m?t x? l? đ? ch?a khóa. M?t khi x? l? này là có đư?c, giá tr? và sub-keys c?a ch?a khóa mà ch?t này dùng đ? ch? có th? đư?c đ?c, thi?t l?p, ho?c đư?c li?t kê (dùng).

Đưa ra m?t v? trí trong registry, có đư?c m?t x? l? cho r?ng ch?a khóa, b?n ph?i b?t đ?u v?i m?t trong các phím đư?c xác đ?nh trư?c sáu (HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_CONFIG, và HKEY_DYN_DATA) và đi qua cây đăng k? cho đ?n khi phím b?n mu?n là đ?t đ?n. Ngư?i s? d?ng chương tr?nh thư?ng xuyên nh?t đ?c và vi?t t? HKEY_CURRENT_USER và HKEY_LOCAL_MACHINE. N?u các phím đư?c ngang đ? t?n t?i, b?n có th? s? d?ng m?t lo?t các cu?c g?i đ?n các ch?c năng RegOpenKey ho?c RegOpenKeyEx. N?u các phím c?n đư?c t?o ra, RegCreateKey và RegCreateKeyEx ch?c năng th?c hi?n công vi?c.

V?i x? l? đ? phím b?n mu?n, các ch?c năng đư?c s? d?ng đ? danh sách, thi?t l?p, và truy xu?t thông tin có th? đư?c g?i là. Trong m?i trư?ng h?p, ch?c năng v?i Ex h?u t? s? làm vi?c ch? trên n?n t?ng 32-bit. Ch?c năng mà không có h?u t? có th? làm vi?c trên 16-bit và 32-bit phiên b?n c?a Windows. H?y nh? r?ng không ph?i t?t c? các ch?c năng cơ quan đăng k? thi?u 'C?' h?u t? là ch?c năng cung c?p cho 16-bit tương thích. H?u t? Ex đư?c ch? b? sung khi các kh? năng c?a ch?c năng 16-bit đ? đư?c m? r?ng. Ch?c năng hoàn toàn m?i và c? th? v?i n?n t?ng 32-bit không có m?t ph?n m? r?ng c?.

RegSetValue và RegSetValueEx các ch?c năng cho phép các thi?t l?p c?a m?t giá tr? đ? đư?c l?n, trong khi RegQueryValue và RegQueryValueEx l?y các thi?t đ?t hi?n th?i c?a m?t giá tr?. Nh?ng h?n ch? c?a các phiên b?n không-Ex, 16-bit các API là r?t hi?n nhiên ? đây. Khi s? d?ng 16-bit RegSetValue ch?c năng đó là không có cách nào đ? tên m?t giá tr?, và v? đi?u này, RegSetValue không th? đư?c s? d?ng đ? k?t h?p nhi?u hơn m?t giá tr? v?i m?i phím. Ngoài ra t?t c? giá tr? b?ng văn b?n v?i RegSetValue có m?t ki?u d? li?u c?a REG_SZ. Đây h?n ch? là c? h?u v?i Registry 16-bit. RegSetValueEx cho phép các sáng t?o c?a m?t s? nhi?u c?a các giá tr? v?i b?t k? lo?i d? li?u s?n có.

Làm th? nào đ? vi?t cho m?t v? trí Registry c? th?

Sau khi xác đ?nh nh?ng g? các ch?c năng b?n s? c?n ph?i s? d?ng cho d? án c?a b?n, b?n sao tuyên b? là có liên quan t? các m? ? ph?n cu?i c?a bài vi?t này đ?n m?t mô-đun cơ b?n. Visual Basic hai th? t?c bao g?m (SetValueEx và QueryValueEx) là hàm bao cho RegSetValueEx và RegQueryValueEx API ch?c năng và r?t nhi?u đơn gi?n hóa vi?c s? d?ng c?a h?. Các ghi chú dư?i đây h?y s? d?ng các Visual Basic functions; Tuy nhiên, b?n đư?c t? do đ? th?c hi?n cu?c g?i tr?c ti?p đ?n các API n?u b?n mu?n.

T?o/s?a đ?i các phím và các giá tr?:

V?i t? khai và th? t?c có s?n, b?n có th? t?o và m? các phím, và thêm, s?a đ?i, và đ?c các giá tr?. Nh?ng ph?n sau ba gi?i thích làm th? nào đ? t?o m?t khóa, đ?t ho?c s?a đ?i m?t giá tr?, và giá tr? m?t truy v?n.

T?o m?t khóa m?i:

T?o m?t khóa là đơn gi?n như s? d?ng th? t?c sau đây. CreateNewKey s? đưa tên c?a ch?a khóa đ? t?o ra, và h?ng s? đ?i di?n cho ch?a khóa đư?c xác đ?nh trư?c đ? t?o khoá dư?i. Các cu?c g?i đ?n RegCreateKeyEx không t?n d?ng l?i th? c?a các cơ ch? b?o m?t đư?c cho phép, nhưng có th? đư?c c?i ti?n đ? làm như v?y. M?t cu?c th?o lu?n v? an ninh Registry là bên ngoài ph?m vi c?a bài vi?t này.
   Private Sub CreateNewKey (sNewKeyName As String, lPredefinedKey As Long)
       Dim hNewKey As Long         'handle to the new key
       Dim lRetVal As Long         'result of the RegCreateKeyEx function

       lRetVal = RegCreateKeyEx(lPredefinedKey, sNewKeyName, 0&, _
                 vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, _
                 0&, hNewKey, lRetVal)
       RegCloseKey (hNewKey)
   End Sub
				

V?i th? t?c này cuoäc goïi c?a:
   CreateNewKey "TestKey", HKEY_LOCAL_MACHINE
				

s? t?o ra m?t khóa đư?c g?i là TestKey ngay l?p t?c dư?i HKEY_LOCAL_MACHINE.

G?i đi?n tho?i CreateNewKey như th? này:
      CreateNewKey "TestKey\SubKey1\SubKey2", HKEY_LOCAL_MACHINE
				

s? t?o ra ba l?ng nhau phím b?t đ?u v?i TestKey ngay l?p t?c dư?i HKEY_CURRENT_USER, SubKey1 dư?i TestKey, và SubKey3 dư?i SubKey2.

Cài đ?t/s?a đ?i m?t giá tr?:

T?o và thi?t l?p m?t giá tr? c?a m?t phím xác đ?nh có th? đư?c th?c hi?n v?i th? t?c sau đây ng?n. SetKeyValue m?t ch?a khóa mà giá tr? s? đư?c liên k?t v?i, tên c?a giá tr?, các thi?t l?p c?a các giá tr?, và lo?i giá tr? (ch?c năng SetValueEx ch? h? tr? REG_SZ và REG_DWORD, nhưng đi?u này có th? s?a đ?i n?u c?n thi?t). Ch? đ?nh m?t giá tr? m?i cho m?t sValueName hi?n có s? s?a đ?i các thi?t l?p hi?n t?i c?a giá tr? đó.
   Private Sub SetKeyValue (sKeyName As String, sValueName As String, _
   vValueSetting As Variant, lValueType As Long)
       Dim lRetVal As Long         'result of the SetValueEx function
       Dim hKey As Long         'handle of open key

       'open the specified key
       lRetVal = RegOpenKeyEx(HKEY_CURRENT_USER, sKeyName, 0, _
                                 KEY_SET_VALUE, hKey)
       lRetVal = SetValueEx(hKey, sValueName, lValueType, vValueSetting)
       RegCloseKey (hKey)
   End Sub
				

M?t cu?c g?i c?a:
   SetKeyValue "TestKey\SubKey1", "StringValue", "Hello", REG_SZ
				

s? t?o ra m?t giá tr? c?a lo?i REG_SZ g?i là "stringvalue" v?i các thi?t l?p c?a "Hello." Giá tr? này s? đư?c k?t h?p v?i phím SubKey1 c?a "testkey."

Trong trư?ng h?p này, "testkey" là m?t subkey HKEY_CURRENT_USER, nhưng đi?u này có th? l?n b?ng cách thay đ?i các cu?c g?i đ?n RegOpenKeyEx. Cu?c g?i này s? th?t b?i n?u "testkey\subkey1" không t?n t?i. Đ? tránh v?n đ? này, s? d?ng m?t cu?c g?i đ?n RegCreateKeyEx thay v? c?a m?t cu?c g?i đ?n RegOpenKeyEx. RegCreateKeyEx s? m? m?t phím xác đ?nh n?u nó đ? t?n t?i.

Câu m?t giá tr?:

Các th? t?c k? ti?p có th? đư?c s? d?ng đ? xác đ?nh các thi?t l?p c?a m?t hi?n có giá tr?. QueryValue m?t tên chính và tên c?a m?t giá tr? liên k?t v?i r?ng ch?a khóa và hi?n th? m?t thông đi?p h?p v?i tương ?ng giá tr?. Nó s? d?ng m?t cu?c g?i đ?n ch?c năng wrapper QueryValueEx đư?c đ?nh ngh?a dư?i đây, mà ch? h? tr? các lo?i REG_SZ và REG_DWORD.
   Private Sub QueryValue (sKeyName As String, sValueName As String)
       Dim lRetVal As Long         'result of the API functions
       Dim hKey As Long         'handle of opened key
       Dim vValue As Variant      'setting of queried value

       lRetVal = RegOpenKeyEx(HKEY_CURRENT_USER, sKeyName, 0, _
   KEY_QUERY_VALUE, hKey)
       lRetVal = QueryValueEx(hKey, sValueName, vValue)
       MsgBox vValue
       RegCloseKey (hKey)
   End Sub
				

V?i th? t?c này, m?t cu?c g?i c?a:
   QueryValue "TestKey\SubKey1", "StringValue"
				

s? hi?n th? m?t h?p thư v?i các thi?t l?p hi?n t?i c?a "stringvalue" có giá tr?, và gi? đ?nh r?ng "stringvalue" t?n t?i trong ch?a khóa "testkey\subkey1".

N?u giá tr? b?n truy v?n không t?n t?i sau đó QueryValue s? tr? l?i m?t l?i m? s? 2 - 'error_badkey'.

Thêm ghi chú:

Các ví d? bên trên s? d?ng các phiên b?n 32-bit m? r?ng c?a s? đăng k? ch?c năng đ?c quy?n. Các ch?c năng này cho phép nhi?u hơn m?t giá tr? đư?c liên k?t v?i m?i phím. Như đư?c th?o lu?n ? trên, 16-bit RegSetValue và RegQueryValue hành đ?ng trên m?t giá tr? duy nh?t k?t h?p v?i phím hi?n t?i (trong đó luôn luôn lo?i REG_SZ). Các ch?c năng này xu?t hi?n trong 32-bit Cơ quan đăng k? biên t?p v?i tên <no name="">. Đ? đ?t, s?a đ?i, ho?c truy v?n này đ?c bi?t giá tr? liên k?t, m?t trong nh?ng ph?i s? d?ng các ch?c năng cơ quan đăng k? 16-bit. Đ?c và vi?t t? s? đăng k? trong m?t môi trư?ng 16-bit là nhi?u đơn gi?n hơn trong m?t môi trư?ng 32-bit. Ti?p theo là các th? t?c cơ b?n tương t?: m? m?t khoá và có đư?c m?t x? l? và sau đó g?i ch?c năng s?a đ?i c?a b?n v?i Đi?u tác đó, nhưng không có nhu c?u xem xét đ? đư?c th?c hi?n cho nhi?u liên k?t các giá tr? ho?c cho các ki?u d? li?u giá tr? khác nhau. ?ng d?ng 16-bit có th? t?o và s?a đ?i các phím và các giá tr? v?i các t? khai c?a RegCreateKey, Ch?c năng RegOpenKey, RegQueryValue, RegSetValue, và RegCloseKey. </no>

Trong m?t s? trư?ng h?p, không có không c?n b?t k? giá tr? đư?c liên k?t v?i m?t phím. M?t ?ng d?ng có th? ch? c?n bi?t n?u m?t khóa nh?t đ?nh ho?c giá tr? t?n t?i, và không chăm sóc v? b?n ch?t c?a các giá tr? c?a key. Trong m?t t?nh hu?ng như th? này, ch?c năng RegEnumKey, RegEnumKeyEx, và RegEnumValue có th? đư?c s? d?ng đ? xác đ?nh li?u m?t khóa nh?t đ?nh ho?c giá tr? t?n t?i. Đ? bi?t thêm thông tin v? các ch?c năng này đ? c?p đ?n tài li?u tham kh?o API Text Viewer và/ho?c Windows API.

API ch?c năng và h?ng s? t? khai

   Option Explicit

   Public Const REG_SZ As Long = 1
   Public Const REG_DWORD As Long = 4

   Public Const HKEY_CLASSES_ROOT = &H80000000
   Public Const HKEY_CURRENT_USER = &H80000001
   Public Const HKEY_LOCAL_MACHINE = &H80000002
   Public Const HKEY_USERS = &H80000003

   Public Const ERROR_NONE = 0
   Public Const ERROR_BADDB = 1
   Public Const ERROR_BADKEY = 2
   Public Const ERROR_CANTOPEN = 3
   Public Const ERROR_CANTREAD = 4
   Public Const ERROR_CANTWRITE = 5
   Public Const ERROR_OUTOFMEMORY = 6
   Public Const ERROR_ARENA_TRASHED = 7
   Public Const ERROR_ACCESS_DENIED = 8
   Public Const ERROR_INVALID_PARAMETERS = 87
   Public Const ERROR_NO_MORE_ITEMS = 259

   Public Const KEY_QUERY_VALUE = &H1
   Public Const KEY_SET_VALUE = &H2
   Public Const KEY_ALL_ACCESS = &H3F

   Public Const REG_OPTION_NON_VOLATILE = 0

   Declare Function RegCloseKey Lib "advapi32.dll" _
   (ByVal hKey As Long) As Long
   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, ByVal lpSecurityAttributes _
   As Long, phkResult As Long, lpdwDisposition As Long) As Long
   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
   Declare Function RegQueryValueExString Lib "advapi32.dll" Alias _
   "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
   String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _
   As String, lpcbData As Long) As Long
   Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias _
   "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
   String, ByVal lpReserved As Long, lpType As Long, lpData As _
   Long, lpcbData As Long) As Long
   Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias _
   "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
   String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _
   As Long, lpcbData As Long) As Long
   Declare Function RegSetValueExString Lib "advapi32.dll" Alias _
   "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
   ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As _
   String, ByVal cbData As Long) As Long
   Declare Function RegSetValueExLong Lib "advapi32.dll" Alias _
   "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
   ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, _
   ByVal cbData As Long) As Long
				

SetValueEx và QueryValueEx Wrapper ch?c năng:
   Public Function SetValueEx(ByVal hKey As Long, sValueName As String, _
   lType As Long, vValue As Variant) As Long
       Dim lValue As Long
       Dim sValue As String
       Select Case lType
           Case REG_SZ
               sValue = vValue & Chr$(0)
               SetValueEx = RegSetValueExString(hKey, sValueName, 0&, _
                                              lType, sValue, Len(sValue))
           Case REG_DWORD
               lValue = vValue
               SetValueEx = RegSetValueExLong(hKey, sValueName, 0&, _
   lType, lValue, 4)
           End Select
   End Function

   Function QueryValueEx(ByVal lhKey As Long, ByVal szValueName As _
   String, vValue As Variant) As Long
       Dim cch As Long
       Dim lrc As Long
       Dim lType As Long
       Dim lValue As Long
       Dim sValue As String

       On Error GoTo QueryValueExError

       ' Determine the size and type of data to be read
       lrc = RegQueryValueExNULL(lhKey, szValueName, 0&, lType, 0&, cch)
       If lrc <> ERROR_NONE Then Error 5

       Select Case lType
           ' For strings
           Case REG_SZ:
               sValue = String(cch, 0)

   lrc = RegQueryValueExString(lhKey, szValueName, 0&, lType, _
   sValue, cch)
               If lrc = ERROR_NONE Then
                   vValue = Left$(sValue, cch-1)
               Else
                   vValue = Empty
               End If
           ' For DWORDS
           Case REG_DWORD:
   lrc = RegQueryValueExLong(lhKey, szValueName, 0&, lType, _
   lValue, cch)
               If lrc = ERROR_NONE Then vValue = lValue
           Case Else
               'all other data types not supported
               lrc = -1
       End Select

   QueryValueExExit:
       QueryValueEx = lrc
       Exit Function

   QueryValueExError:
       Resume QueryValueExExit
   End Function
				

THAM KH?O

L?p tr?nh giao di?n ngư?i dùng Windows 95, chương 10-"b?ng cách s? d?ng các Cơ quan đăng k?"

Tài li?u tham kh?o ch?c năng: b?t k? hư?ng d?n Win16 ho?c Win32 API.

Thu?c tính

ID c?a bài: 145679 - L?n xem xét sau cùng: 18 Tháng Tám 2011 - Xem xét l?i: 2.0
Áp d?ng
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic for Applications 6.0
T? khóa: 
kbcode kbhowto kbtophit kbmt KB145679 KbMtvi
Máy d?ch
QUAN TRỌNG: Bài vi?t này đư?c d?ch b?ng ph?n m?m d?ch máy c?a Microsoft ch? không ph?i do con ngư?i d?ch. Microsoft cung c?p các bài vi?t do con ngư?i d?ch và c? các bài vi?t do máy d?ch đ? b?n có th? truy c?p vào t?t c? các bài vi?t trong Cơ s? Ki?n th?c c?a chúng tôi b?ng ngôn ng? c?a b?n. Tuy nhiên, bài vi?t do máy d?ch không ph?i lúc nào c?ng hoàn h?o. Lo?i bài vi?t này có th? ch?a các sai sót v? t? v?ng, cú pháp ho?c ng? pháp, gi?ng như m?t ngư?i nư?c ngoài có th? m?c sai sót khi nói ngôn ng? c?a b?n. Microsoft không ch?u trách nhi?m v? b?t k? s? thi?u chính xác, sai sót ho?c thi?t h?i nào do vi?c d?ch sai n?i dung ho?c do ho?t đ?ng s? d?ng c?a khách hàng gây ra. Microsoft c?ng thư?ng xuyên c?p nh?t ph?n m?m d?ch máy này.
Nh?p chu?t vào đây đ? xem b?n ti?ng Anh c?a bài vi?t này:145679

Cung cấp Phản hồi

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com