タイトル レジストリキーの値を取得する
対象言語 VB4.0, Access95以降
動作確認OS Windows95,98,NT4.0
使用関数 RegQueryValueEx RegOpenKeyEx RegCloseKey
改築日 1999/06/22(1998/06/18)
Source Download

レジストリから、文字列、数値、バイナリ値
を取得します。

HKEY_CURRENT_USERキーの
サブキー Software\VB and VBA Program Settings\TEST
にある キー値、StringTest,DWordTest,BinaryTest
の値を取得します。
(これらの値は 040102 のサンプルで作成された値です)

注意!!
レジストリを操作するのは大変危険です。へたにいじるとWindowsが起動
しなくなるかもしれません。ご注意下さい!!

1. フォームを作成しコマンドボタン(Command1)、テキストボックス(Text1,text2,Text3)を貼り付けてください。


Private Sub Command1_Click()

  Dim RootKey As Long
  Dim KeyPth As String
  Dim ByteBuf() As Byte
  Dim strbuf As String

  RootKey = HKEY_CURRENT_USER
  KeyPth = "Software\VB and VBA Program Settings\TEST"
'文字列取得
  Text1 = Y_GetRegValue(RootKey, KeyPth, "StringTest", "見つかりませんでした(ToT)")
'DWORD値取得
  Text2 = Y_GetRegValue(RootKey, KeyPth, "DWordTest", 0)
'バイナリ値取得
  ByteBuf() = Y_GetRegValue(RootKey, KeyPth, "BinaryTest", vbNullChar)
  strbuf = String$(UBound(ByteBuf) * 2, vbNullChar)
  LSet strbuf = StrConv(ByteBuf, vbUnicode)
  Text3 = EditBuf(strbuf)

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 RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" _
(ByVal hkey As Long, ByVal lpszValueName As String, ByVal dwReserved As Long, _
lpdwType As Long, lpbData As Any, cbData 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 Function Y_GetRegValue(hkey As Long, SubKey As String, KeyName As String, DefaultValue As Variant) As Variant

'***********************************************************
'機能 : レジストリの値を取得する
'引数 :  hKey  = 取得するサブキーの親キー
'     SubKey = 取得するサブキーのパス
'     KeyName = 取得する値の名前
'     DefaultValue = データが無い場合の戻り値
'戻り値: レジストリの値
'***********************************************************

  Dim phKey As Long
  Dim DataType As Long
  Dim LenBuf As Long
  Dim strbuf As String
  Dim DWordBuf As Currency
  Dim ByteBuf() As Byte
  Dim longret As Long

'レジストリキーを開く
  If RegOpenKeyEx(hkey, SubKey, 0, KEY_ALL_ACCESS, phKey) = ERROR_SUCCESS Then

'バッファサイズとデータタイプを取得する
    If RegQueryValueEx(phKey, KeyName, 0, DataType, ByVal 0, LenBuf) = ERROR_SUCCESS Then

'データタイプ毎にキー値の取得
      Select Case DataType
        Case REG_SZ '文字列
          strbuf = String$(LenBuf, vbNullChar)
          longret = RegQueryValueEx(phKey, KeyName, 0, DataType, ByVal strbuf, LenBuf)
          Y_GetRegValue = EditBuf(strbuf)

        Case REG_DWORD 'DWORD値
          longret = RegQueryValueEx(phKey, KeyName, 0, DataType, DWordBuf, LenBuf)
          Y_GetRegValue = DWordBuf * 10000 '符号無しで取得する為に Currency型で受け取る

        Case REG_BINARY 'バイナリ
          ByteBuf = String$(LenBuf, vbNullChar)
          longret = RegQueryValueEx(phKey, KeyName, 0, DataType, ByteBuf(0), LenBuf)
          Y_GetRegValue = ByteBuf

        Case Else 'その他
          Y_GetRegValue = DefaultValue
      End Select
    Else
      Y_GetRegValue = DefaultValue
    End If

'レジストリを閉じる
    longret = RegCloseKey(phKey)
  Else
    Y_GetRegValue = DefaultValue
  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.