Cara menggunakan registri API untuk menyimpan dan mengambil pengaturan

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 145679 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Meskipun Visual Basic meliputi fungsi SaveSetting dan GetSetting untuk menyimpan dan mengambil informasi dari registri, fungsi-fungsi ini hanya beroperasi pada bagian tertentu dari registri, Visual Basic dan VBA Program pengaturan HKEY_CURRENT_USER akar kunci.

Artikel ini menguraikan penggunaan fungsi Windows API 32-bit, yang dapat digunakan untuk menetapkan dan mengambil nilai dari mana saja di registri. Topik dan fungsi referensi dalam artikel ini dapat dirampatkan ke program 16-bit registri.

API 32-bit fungsi juga termasuk dukungan untuk keamanan, meskipun Ikhtisar keamanan adalah di luar cakupan artikel ini.

Catatan: Fungsi SaveSetting dan GetSetting bukan merupakan bagian dari VBA fungsi perpustakaan. Namun, kode contoh di bawah ini masih berlaku untuk 32-bit aplikasi yang menerapkan VBA.

INFORMASI LEBIH LANJUT

Informasi registri umum

Registri yang digunakan oleh aplikasi dan Windows untuk menyimpan konfigurasi data. Itu adalah pengganti untuk sejumlah besar INI file yang pengkembang pada Windows 3.x mesin dan juga digunakan berat oleh OLE.

Registri diatur menggunakan serangkaian hirarkis kunci dan nilai-nilai menyerupai sebuah pohon. Setiap tombol, dimulai dengan salah satu enam standar kunci, dapat memiliki sub-keys dan nilai-nilai yang terkait dengannya. Tombol yang organisasi dan penamaan unit dan muncul dalam Windows Registry Editor sebagai file folder. Nilai-nilai entri data dan muncul sebagai entri teks dalam pane kanan Peninjau Suntingan Registri. Kunci tidak perlu apapun terkait nilai-nilai, tetapi mungkin memiliki banyak. Setiap nilai memiliki tipe data terkait. Dua jenis data registri yang paling sering digunakan adalah REG_SZ, null-dihentikan string; dan REG_DWORD, nomor 32-bit.

Proses dasar yang digunakan untuk menulis atau membaca dari lokasi di registri Sama. Untuk referensi kunci tertentu atau nilai, Anda harus memiliki pegangan untuk tombol. Setelah menangani ini diperoleh, nilai-nilai dan sub-keys kunci yang mengacu pada pegangan ini dapat dibaca, mengatur, atau terdaftar (disebutkan).

Diberikan sebuah lokasi di registri, untuk mendapatkan pegangan yang kunci, Anda harus mulai dengan salah satu tombol standar enam (HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_CONFIG, dan HKEY_DYN_DATA) dan melintasi pohon registri sampai tombol yang diinginkan mencapai. Program-program pengguna paling sering membaca dan menulis dari HKEY_CURRENT_USER dan HKEY_LOCAL_MACHINE. Jika tombol yang dilalui sudah ada, Anda dapat menggunakan serangkaian panggilan ke fungsi RegOpenKey atau RegOpenKeyEx. Jika tombol perlu dibuat, fungsi RegCreateKey dan RegCreateKeyEx melakukan pekerjaan.

Dengan menangani ke tombol yang dikehendaki, fungsi digunakan untuk daftar, mengatur, dan mengambil informasi dapat disebut. Dalam semua kasus, fungsi dengan Ex akhiran akan bekerja hanya pada 32-bit platform. Fungsi tanpa akhiran mungkin bekerja pada 16-bit dan 32-bit versi Windows. Perlu diingat bahwa tidak semua fungsi registri yang kurang 'Ex' akhiran adalah fungsi yang disediakan untuk 16-bit kompatibilitas. Akhiran Ex hanya ditambahkan ketika kemampuan 16-bit fungsi diperluas. Fungsi yang sama sekali baru dan khusus untuk 32-bit platform tidak memiliki ekstensi mantan.

Fungsi RegSetValue dan RegSetValueEx memungkinkan pengaturan nilai diubah, sementara mengambil RegQueryValue dan RegQueryValueEx Current pengaturan nilai. Keterbatasan non-Ex, 16-bit versi api ini sangat jelas di sini. Ketika menggunakan RegSetValue 16-bit fungsi ada adalah tidak ada cara untuk nama nilai, dan karena ini, RegSetValue tidak dapat digunakan untuk menghubungkan nilai lebih dari satu dengan kunci masing-masing. Sebagai tambahan semua nilai ditulis dengan RegSetValue memiliki tipe data REG_SZ. Ini keterbatasan melekat dengan Registry 16-bit. RegSetValueEx memungkinkan pembentukan sejumlah beberapa nilai-nilai dengan setiap jenis data yang tersedia.

Bagaimana menulis ke lokasi registri tertentu

Setelah menentukan apa fungsi yang Anda akan perlu menggunakan untuk proyek Anda, salinan yang relevan menyatakan dari kode pada akhir artikel ini untuk modul dasar. Prosedur Visual Basic dua termasuk (SetValueEx dan QueryValueEx) adalah pembungkus untuk RegSetValueEx dan RegQueryValueEx API fungsi dan sangat menyederhanakan penggunaan mereka. Catatan di bawah ini membuat menggunakan ini Visual Basic functions; Namun, bebas untuk membuat panggilan langsung ke API jika Anda inginkan.

Menciptakan/memodifikasi kunci dan nilai-nilai:

Dengan Deklarasi dan prosedur yang tersedia, Anda dapat membuat dan membuka tombol, dan menambahkan, memodifikasi, dan membaca nilai-nilai. Bagian berikut tiga menjelaskan cara membuat kunci, mengatur atau mengubah nilai, dan permintaan nilai.

Membuat kunci baru:

Membuat kunci baru yang sederhana seperti menggunakan prosedur berikut. CreateNewKey mengambil nama kunci untuk membuat, dan terus-menerus mewakili tombol standar untuk menciptakan kunci di bawah. Panggilan untuk RegCreateKeyEx tidak mengambil keuntungan dari mekanisme keamanan yang diizinkan, tapi bisa diubah untuk melakukannya. Diskusi registri keamanan di luar ruang lingkup artikel ini.
   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
				

Dengan prosedur ini panggilan dari:
   CreateNewKey "TestKey", HKEY_LOCAL_MACHINE
				

akan menciptakan sebuah kunci yang disebut TestKey di bawah HKEY_LOCAL_MACHINE.

Memanggil CreateNewKey seperti ini:
      CreateNewKey "TestKey\SubKey1\SubKey2", HKEY_LOCAL_MACHINE
				

akan membuat bersarang tiga kunci dimulai dengan TestKey segera di bawah HKEY_CURRENT_USER, SubKey1 subordinate untuk TestKey, dan SubKey3 di bawah SubKey2.

Pengaturan/memodifikasi nilai:

Membuat dan menetapkan nilai kunci tertentu dapat dicapai dengan short prosedur berikut. SetKeyValue mengambil kunci yang nilai akan dikaitkan dengan nama nilai, menetapkan nilai, dan jenis nilai (fungsi SetValueEx hanya mendukung REG_SZ dan REG_DWORD, tetapi ini dapat diubah jika diperlukan). Menentukan nilai baru untuk sValueName ada akan mengubah pengaturan saat ini nilai.
   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
				

Panggilan:
   SetKeyValue "TestKey\SubKey1", "StringValue", "Hello", REG_SZ
				

akan menciptakan nilai jenis REG_SZ disebut "StringValue" dengan setting "Halo." Nilai ini akan dikaitkan dengan kunci SubKey1 "TestKey."

Dalam kasus ini, "TestKey" adalah subkunci HKEY_CURRENT_USER, tetapi ini dapat diubah dengan mengubah panggilan untuk RegOpenKeyEx. Panggilan ini akan gagal jika "TestKey\SubKey1" tidak ada. Untuk menghindari masalah ini, gunakan panggilan untuk RegCreateKeyEx bukannya panggilan untuk RegOpenKeyEx. RegCreateKeyEx akan terbuka kunci tertentu jika sudah ada.

Query nilai:

Prosedur berikutnya dapat digunakan untuk memastikan pengaturan yang ada nilai. QueryValue mengambil nama kunci dan nama nilai terkait dengan kunci dan menampilkan pesan kotak dengan yang sesuai nilai. Menggunakan panggilan untuk pembungkus QueryValueEx fungsi yang didefinisikan di bawah ini, yang hanya mendukung jenis REG_SZ dan 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
				

Dengan prosedur ini, panggilan dari:
   QueryValue "TestKey\SubKey1", "StringValue"
				

akan menampilkan kotak pesan dengan pengaturan saat ini "StringValue" nilai, dan mengasumsikan bahwa "StringValue" ada di tombol "TestKey\SubKey1".

Jika nilai yang Anda permintaan tidak ada maka QueryValue akan kembali kode kesalahan 2 - 'ERROR_BADKEY'.

Catatan tambahan:

Contoh di atas menggunakan versi 32-bit diperpanjang registri fungsi secara eksklusif. Fungsi-fungsi ini memungkinkan lebih dari satu nilai untuk menjadi terkait dengan masing-masing kunci. Seperti yang dibahas di atas, RegSetValue 16-bit dan RegQueryValue UU pada nilai tunggal yang terkait dengan tombol saat ini (yang ini selalu jenis REG_SZ). Fungsi-fungsi ini muncul dalam 32-bit Peninjau Suntingan Registri dengan nama <no name="">. Untuk mengatur, mengubah, atau permintaan ini nilai terkait khusus, salah satu harus menggunakan fungsi 16-bit registri. Membaca dan menulis dari registri di lingkungan 16-bit adalah banyak lebih sederhana daripada di lingkungan 32-bit. Prosedur dasar yang sama mengikuti: Buka kunci dan mendapatkan pegangan dan kemudian memanggil fungsi modifikasi Anda dengan yang menangani, tetapi tidak ada pertimbangan perlu dibuat untuk beberapa terkait nilai-nilai atau untuk tipe data nilai yang berbeda. Aplikasi 16-bit yang dapat membuat dan memodifikasi kunci dan nilai-nilai dengan Deklarasi RegCreateKey, Fungsi RegOpenKey, RegQueryValue, RegSetValue, dan RegCloseKey. </no>

Dalam beberapa kasus, ada tidak perlu untuk setiap nilai dikaitkan dengan kunci. Aplikasi mungkin hanya perlu tahu jika kunci tertentu atau nilai ada, dan tidak peduli tentang sifat nilai-nilai kunci. Dalam situasi seperti ini, fungsi RegEnumKey, RegEnumKeyEx, dan RegEnumValue dapat digunakan untuk menentukan apakah kunci atau nilai tertentu ada. Untuk informasi lebih lanjut tentang fungsi-fungsi ini merujuk pada referensi API penampil teks dan/atau Windows API.

Fungsi API dan konstan Deklarasi

   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 dan QueryValueEx Wrapper fungsi:
   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
				

REFERENSI

Pemrograman Windows 95 antarmuka pengguna, bab 10-"menggunakan Registry"

Untuk fungsi referensi: Panduan untuk Win16 atau Win32 API.

Properti

ID Artikel: 145679 - Kajian Terakhir: 15 September 2011 - Revisi: 2.0
Berlaku bagi:
  • 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
Kata kunci: 
kbcode kbhowto kbtophit kbmt KB145679 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:145679

Berikan Masukan

 

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