レジストリのサブキーを列挙          <TOP>


レジストリのサブキーを列挙します。

RegOpenKeyEx レジストリキーのハンドルを取得

RegCloseKey レジストリのハンドルを解放

SHEnumKeyEx レジストリのサブキーを列挙

 

 

'================================================================
'= レジストリのサブキーを列挙
'=    (RegSubKeyList.bas)
'================================================================
#include "Windows.bi"

' レジストリのキーのハンドルを確保
Declare Function Api_RegOpenKeyEx& Lib "advapi32" Alias "RegOpenKeyExA" (ByVal hKey&, ByVal lpSubKey$, ByVal ulOptions&, ByVal samDesired&, phkResult&)

' レジストリのハンドルを解放
Declare Function Api_RegCloseKey& Lib "advapi32" Alias "RegCloseKey" (ByVal hKey&)

' レジストリのサブキーを列挙
Declare Function Api_SHEnumKeyEx& Lib "Shlwapi" Alias "SHEnumKeyExA" (ByVal hKey&, ByVal dwIndex&, ByVal pszName$, pcchName&)

#define HKEY_CLASSES_ROOT -2147483648   '拡張子に関する情報や、それらとアプリケーションとの関連づけに関する情報
#define HKEY_CURRENT_USER -2147483647   '現在Windowsにログインしているユーザーの情報
#define HKEY_LOCAL_MACHINE -2147483646  'PCを利用するユーザーに共通の設定情報
#define HKEY_USERS -2147483645          'Windowsを利用するユーザー個別の情報
#define HKEY_CURRENT_CONFIG -2147483643 'Display解像度/Font等の画面表示に関するカレントユーザーの情報、プリンターに関する情報

#define HKEY_DYN_DATA -2147483642       '動的に変化する様々な情報
#define KEY_QUERY_VALUE &H1             'サブキーデータを問い合わせるためのアクセス権
#define REGSTR_MAX_VALUE_LENGTH 256
#define ERROR_NO_MORE_ITEMS 259
#define ERROR_SUCCESS &H0               '正常終了の戻り値を示す

Var Shared List1 As Object
Var Shared Combo1 As Object
Var Shared Button1 As Object

List1.Attach GetDlgItem("List1") : List1.SetFontSize 14
Combo1.Attach GetDlgItem("Combo1") : Combo1.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Combo1.AddString "HKEY_CLASSES_ROOT"
    Combo1.AddString "HKEY_CURRENT_USER"
    Combo1.AddString "HKEY_LOCAL_MACHINE"
    Combo1.AddString "HKEY_USERS"
    Combo1.AddString "HKEY_CURRENT_CONFIG"
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var hKeys As Long
    Var Item As Long
    Var hRegSubKey As Long
    Var strRegSubKey As String
    Var strRegEnumSubKey As String
    Var SubKeyIndex As Long
    Var SubKeyNameLength As Long
    Var Ret As Long

    Item = Combo1.GetCursel
    If Item < 0 Then
        A% = MessageBox("", "項目を選択してください!", 0, 2)
        Exit Sub
    End If

    Select Case Item
        Case 0
            hKeys = HKEY_CLASSES_ROOT
        Case 1
            hKeys = HKEY_CURRENT_USER
        Case 2
            hKeys = HKEY_LOCAL_MACHINE
        Case 3
            hKeys = HKEY_USERS
        Case 4
            hKeys = HKEY_CURRENT_CONFIG
    End Select
    
    'リストボックスをクリア
    List1.ResetContent

    'サブキーを列挙するキーのパスを設定
    strRegSubKey = ""

    'レジストリを読み取りモードでオープン
    Ret = Api_RegOpenKeyEx(hKeys, strRegSubKey, 0, KEY_QUERY_VALUE, hRegSubKey)

    'オープンエラーのとき
    If Ret <> ERROR_SUCCESS Then
        'エラーを表示して終了
        List1.AddString "キーのオープンに失敗しました"
        Exit Sub
    End If

    'サブキーのインデックスを初期化
    SubKeyIndex = 0

    'サブキーの列挙が完了するまで処理を反復
    Do
        '列挙するサブキー名の格納バッファを初期化
        strRegEnumSubKey = Space$(REGSTR_MAX_VALUE_LENGTH)

        'バッファサイズを初期化
        SubKeyNameLength = Len(strRegEnumSubKey)

        'インデックスで指定したサブキーを取得
        Ret = Api_SHEnumKeyEx(hRegSubKey, SubKeyIndex, strRegEnumSubKey, SubKeyNameLength)

        '列挙するサブキーがないとき
        If Ret = ERROR_NO_MORE_ITEMS Then
            '反復処理終了
            Exit Do
        End If

        'リストボックスに取得したサブキーを追加
        List1.AddString Left$(strRegEnumSubKey, InStr(strRegEnumSubKey, Chr$(0)) - 1)

        'サブキーのインデックスを加算
        SubKeyIndex = SubKeyIndex + 1
    Loop

    'レジストリをクローズ
    Ret = Api_RegCloseKey(hRegSubKey)
End Sub

'================================================================
'=
'================================================================
Declare Sub Combo1_Change edecl ()
Sub Combo1_Change()
    List1.Resetcontent
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End