● レジストリから値を取得する ●

レジストリから値を取得しましょう。文字列と数値、それぞれが取得可能。
インターネットエクスプローラのフルパスを取得するコードをサンプルとして用意しておきました。

Private 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

Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, _
                                        ByVal lpValueName As String, ByVal lpReserved As Long, _
                                        lpType As Long, lpData As Any, lpcbData As Long) As Long

Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

Private Const ERROR_SUCCESS = 0&

Private Const SYNCHRONIZE = &H100000
Private Const READ_CONTROL = &H20000
Private Const STANDARD_RIGHTS_READ = (READ_CONTROL)
Private Const KEY_QUERY_VALUE = &H1
Private Const KEY_SET_VALUE = &H2
Private Const KEY_CREATE_SUB_KEY = &H4
Private Const KEY_ENUMERATE_SUB_KEYS = &H8
Private Const KEY_NOTIFY = &H10
Private Const KEY_CREATE_LINK = &H20
'Private Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)
'Private Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or _
                            KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
Private Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or _
                    KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
'Private Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or _
                    KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or _
                    KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))

'列挙対にしてまえ
'レジストリのキー種類
Public Enum EnumRegKeyType
    HKEY_CLASSES_ROOT = &H80000000
    HKEY_CURRENT_USER = &H80000001
    HKEY_LOCAL_MACHINE = &H80000002
    HKEY_USERS = &H80000003
    HKEY_PERFORMANCE_DATA = &H80000004
    HKEY_CURRENT_CONFIG = &H80000005
    HKEY_DYN_DATA = &H80000006
End Enum

'レジストリの値の種類
Private Const REG_SZ = 1
Private Const REG_DWORD = 4

'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
' 機  能:文字列を Chr$(0)[=vbNullChar] まで取得する
' 引  数:(in)SrcStr … 対象文字列
' 返り値:編集された文字列
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Public Function StrNullCut(ByVal SrcStr As String) As String
    Dim NullCharPos As Integer
    NullCharPos = InStr(SrcStr, Chr$(0))
    If NullCharPos = 0 Then
        StrNullCut = SrcStr
        Exit Function
    End If
    StrNullCut = Left$(SrcStr, NullCharPos - 1)
End Function

'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
' 機  能:レジストリから値を取得する
' 引  数:(i)RegKeyType  … レジストリのキー(ル〜ト名)
'         (i)RegRoot     … ル〜ト以下のパス
'         (i)RegName     … 取得する値のキー(vbNullStringが指定された場合は「(標準)」がキーとなる)
'         (i)IsRegValStr … 取得する値が文字列の場合はTrue、数値の場合はFalse
'         (o)RegValue    … 取得した値(数値の場合は文字列化される(間抜け))
' 返り値:正常…True  異常…False
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Public Function GetRegValue(ByVal RegKeyType As EnumRegKeyType, ByVal RegRoot As String, _
                                       ByVal RegName As String, ByVal IsRegValStr As Boolean, _
                                       ByRef RegValue As String) As Boolean
    Dim hRegKey As Long
    Dim FuncRet As Long

    'レジストリを開く
    FuncRet = RegOpenKeyEx(RegKeyType, RegRoot, 0&, KEY_READ, hRegKey)
    If FuncRet <> ERROR_SUCCESS Then Exit Function

    '文字列を取得
    If IsRegValStr Then
        Dim RegStrBuffer As String * 256
        FuncRet = RegQueryValueEx(hRegKey, RegName, 0&, REG_SZ, ByVal RegStrBuffer, Len(RegStrBuffer))
        If FuncRet = ERROR_SUCCESS Then
            RegValue = StrNullCut(RegStrBuffer)
        End If
    '数値を取得
    Else
        Dim RegLngBuffer As Long
        FuncRet = RegQueryValueEx(hRegKey, RegName, 0&, REG_DWORD, RegLngBuffer, Len(RegStrBuffer))
        If FuncRet = ERROR_SUCCESS Then
            RegValue = CStr(RegLngBuffer)
        End If
    End If

    GetRegValue = (FuncRet = ERROR_SUCCESS)
End Function

'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
' 機  能:インターネットエクスプローラのフルパスを取得する
' 引  数:なし
' 返り値:インターネットエクスプローラのフルパス
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Public Function GetIEPath() As String
    Dim FuncRet As Boolean

    'レジストリからインターネットエクスプローラのフルパスをブッコ抜く
    FuncRet = GetRegValue(HKEY_LOCAL_MACHINE, _
                          "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\IEXPLORE.EXE", _
                          vbNullString, True, GetIEPath)

    'レジストリデータ取得、まさかの失敗の場合
    If FuncRet = False Then
        '[候補1]
        'SpecialFolder API で CSIDL_PROGRAM_FILES を指定して、"Program Files" のパスを取得し、
        '"Internet Explorer\iexplore.exe" を連結する?
        '[候補2]
        '不明?
    End If
End Function

戻る