Làm thế nào để sử dụng Registry API để lưu và lấy các thiết đặt

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
Bài viết này đã được lưu trữ. Bài viết được cung cấp "nguyên trạng" và sẽ không còn được cập nhật nữa.
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à VBACà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ộtTổ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 VBAchức năng thư viện. Tuy nhiên, mẫu mã dưới đây vẫn còn áp dụng cho 32-bitcá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ìnhdữ 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ướcphím, có thể có sub-keys và các giá trị liên kết với nó. Các phímtổ chức và đặt tên đơn vị và xuất hiện trong Windows Registry Editornhư 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áccử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ếtcá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. Hailoại dữ liệu đăng ký thông dụng nhất là REG_SZ, một null chấm dứtchuỗ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ảibắ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ụngmộ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ímcầ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 Exhậ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ảitấ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 cho16-bit tương thích. Hậu tố Ex được chỉ bổ sung khi các khả năng củachứ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ácthiế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-bitcác API là rất hiển nhiên ở đây. Khi sử dụng 16-bit RegSetValuechức năng đó là không có cách nào để tên một giá trị, và vì điều này, RegSetValuekhô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 ratấ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. Đâyhạn chế là cố hữu với Registry 16-bit. RegSetValueEx cho phép cácsá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ộtmô-đun cơ bản. Visual Basic hai thủ tục bao gồm (SetValueEx vàQueryValueEx) là hàm bao cho RegSetValueEx và RegQueryValueEx APIchứ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ácVisual Basic functions; Tuy nhiên, bạn được tự do để thực hiện cuộc gọi trực tiếp đến cácAPI 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 bagiả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 đếnRegCreateKeyEx 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ướiHKEY_CURRENT_USER, SubKey1 dưới TestKey, và SubKey3 dướiSubKey2.

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ớithủ 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ớicho 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 đếnRegCreateKeyEx 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 ứnggiá 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ộtlỗ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ị đượcliê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-bitCơ 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ếtcá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ạovà 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ácCơ 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.
đăng ký

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 145679 - Xem lại Lần cuối: 12/04/2015 13:13:26 - Bản sửa đổi: 2.0

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

  • kbnosurvey kbarchive kbcode kbhowto kbtophit kbmt KB145679 KbMtvi
Phản hồi