タイトル | レジストリの値を列挙する |
対象言語 | VB4.0, Access95以降 |
動作確認OS | Windows95,98,NT4.0 |
使用関数 | RegEnumValue RegOpenKeyEx RegCloseKey |
改築日 | 1999/07/07(1998/06/18) |
Source Download |
レジストリサブキー内の全てのキー値を列挙 して値を取得します。 レジストリからまとめて値を取得したり、キー名が不明の時に 使うと便利です。 HKEY_CURRENT_USERキーの サブキー Software\VB and VBA Program Settings\TEST にある 全てのキー名と値を取得し件数を表示します。 注意!! レジストリを操作するのは大変危険です。へたにいじるとWindowsが起動 しなくなるかもしれません。ご注意下さい!! |
![]() |
1. フォームを作成しコマンドボタン(Command1)を貼り付けてください。 Option Explicit Private Sub Command1_Click() Dim RootKey As Long Dim KeyPth As String Dim KeyNm As String Dim i As Long Dim cnt As Long RootKey = HKEY_CURRENT_USER KeyPth = "Software\VB and VBA Program Settings\TEST" cnt = Y_GetRegEnum(RootKey, KeyPth) If cnt = -1 Then Call MsgBox("キーが見つからんかったでぇ (ToT)") Else List1.Clear For i = 0 To cnt List1.AddItem KeyList(i) Next Call MsgBox("キーを列挙出来ました (^_^)v" + vbCrLf + "件数 =" & cnt + 1) End If End Sub |
2.モジュールウインドウを作成し、下のソースを入力してください。 Option Explicit 'レジストリを開く Declare Function RegOpenKeyEx Lib "advapi32" 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 RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long 'レジストリのキーを列挙する Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" _ (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, _ lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long 'hKeyの設定値 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 HKEY_CURRENT_CONFIG = &H80000005 Public Const HKEY_DYN_DATA = &H80000006 'lpTypeの戻り値 Public Const REG_BINARY = 3 ' Free form binary Public Const REG_DWORD = 4 ' 32-bit number Public Const REG_DWORD_LITTLE_ENDIAN = 4 ' 32-bit number (same as REG_DWORD) Public Const REG_DWORD_BIG_ENDIAN = 5 ' 32-bit number Public Const REG_EXPAND_SZ = 2 ' Unicode nul terminated string Public Const REG_LINK = 6 ' Symbolic Link (unicode) Public Const REG_MULTI_SZ = 7 ' Multiple Unicode strings Public Const REG_NONE = 0 ' No value type Public Const REG_RESOURCE_LIST = 8 ' Resource list in the resource map Public Const REG_SZ = 1 ' Unicode nul terminated string Public Const KEY_ALL_ACCESS = &HF003F Public Const ERROR_SUCCESS = 0 Public KeyList() As String '列挙されたキーの名前の配列 Public Function Y_GetRegEnum(hKey As Long, SubKey As String) As Long '*********************************************************** '機能 : レジストリのキーを列挙する '引数 : hKey = 取得するサブキーの親キー ' SubKey = 取得するサブキーのパス '戻り値: 列挙したキーの数 -1 '*********************************************************** Dim phKey As Long Dim longret As Long Dim KeyName As String Dim LenKeyName As Long Dim LenBuf As Long Dim Idx As Long Dim DataType As Long Dim ByteBuf() As Byte Dim strbuf As String Dim DWordBuf As Currency '配列初期化 ReDim keykust(0) 'レジストリキーを開く If RegOpenKeyEx(hKey, SubKey, 0, KEY_ALL_ACCESS, phKey) = ERROR_SUCCESS Then Idx = 0 longret = ERROR_SUCCESS Do While True 'longret = ERROR_SUCCESS KeyName = String$(80, vbNullChar) LenKeyName = Len(KeyName) 'レジストリキーを列挙 If RegEnumValue(phKey, Idx, KeyName, LenKeyName, ByVal 0&, DataType, ByVal 0&, LenBuf) = ERROR_SUCCESS Then ReDim Preserve KeyList(Idx) KeyList(Idx) = EditBuf(KeyName) & " = " 'データタイプ毎に値を取得する Select Case DataType Case REG_SZ '文字列 strbuf = String$(LenBuf, vbNullChar) longret = RegEnumValue(phKey, Idx, KeyName, LenKeyName, ByVal 0&, DataType, ByVal strbuf, LenBuf) KeyList(Idx) = KeyList(Idx) & EditBuf(strbuf) Case REG_DWORD 'DWORD値 longret = RegEnumValue(phKey, Idx, KeyName, LenKeyName, ByVal 0&, DataType, DWordBuf, LenBuf) DWordBuf = DWordBuf * 10000 '符号無しで取得する為に Currency型で受け取る KeyList(Idx) = KeyList(Idx) & DWordBuf Case REG_BINARY 'バイナリ ByteBuf = String$(LenBuf, vbNullChar) longret = RegEnumValue(phKey, Idx, KeyName, LenKeyName, ByVal 0&, DataType, ByteBuf(0), LenBuf) KeyList(Idx) = KeyList(Idx) & StrConv(ByteBuf, vbUnicode) End Select Idx = Idx + 1 Else Exit Do End If Loop 'レジストリを閉じる longret = RegCloseKey(phKey) Y_GetRegEnum = Idx - 1 Else Y_GetRegEnum = -1 End If End Function Public Function EditBuf(Buf As String) As String '*********************************************************** '機能 : 引数 Bufの文字列中の Nullコードを検索し、Nullコードを ' 除いた文字列を返す '引数 : Buf = Nullコードを含む文字列 '戻り値: Nullコードを除いた文字列 '*********************************************************** Dim i As Long i = InStr(Buf, vbNullChar) If i <> 0 Then EditBuf = Left$(Buf, i - 1) Else EditBuf = Buf End If End Function |
Copyright (C)1997-2001 空耳工房 MY2Project All rights reserved. |