レジストリの最終書込時間を取得          <TOP>


RegEnumKeyEx 指定された開いているレジストリーキーのサブキーを列挙
RegOpenKeyEx レジストリのキーのハンドルを確保
RegCloseKey レジストリのハンドルを解放
FileTimeToSystemTime ファイルタイムをシステムタイムに変換
 

参考

レジストリのキーを列挙(T)

レジストリのキーを列挙(U)

 

'================================================================
'= レジストリの最終書込時間を取得
'=    (RegOpenKeyEx.bas)
'================================================================
#include "Windows.bi"

#define HKEY_CLASSES_ROOT -2147483648   '拡張子に関する情報や、それらとアプリケーションとの関連づけに関する情報
#define HKEY_CURRENT_CONFIG -2147483643 'Display解像度/Font等の画面表示に関するカレントユーザーの情報、プリンターに関する情報
#define HKEY_CURRENT_USER -2147483647   '現在Windowsにログインしているユーザーの情報
#define HKEY_DYN_DATA -2147483642       '動的に変化する様々な情報
#define HKEY_LOCAL_MACHINE -2147483646  'PCを利用するユーザーに共通の設定情報
#define HKEY_USERS -2147483645          'Windowsを利用するユーザー個別の情報
#define KEY_ENUMERATE_SUB_KEYS &H8      'サブキーの列挙を許可
#define ERROR_NO_MORE_ITEMS 259         '
#define REGSTR_MAX_VALUE_LENGTH 256     '

Type FILETIME
    dwLowDateTime  As Long              '下位32ビット値
    dwHighDateTime As Long              '上位32ビット値
End Type

Type SYSTEMTIME
    wYear         As Integer            '年
    wMonth        As Integer            '月(1:1月  2:2月 ...)
    wDayOfWeek    As Integer            '曜(0:日曜 1:月曜 ...)
    wDay          As Integer            '日(1:1日  2:2日 ...)
    wHour         As Integer            '時
    wMinute       As Integer            '分
    wSecond       As Integer            '秒
    wMilliseconds As Integer            'ミリ秒
End Type

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

' 指定された開いているレジストリーキーのサブキーを列挙
Declare Function Api_RegEnumKeyEx& Lib "advapi32" Alias "RegEnumKeyExA" (ByVal hKey&, ByVal dwIndex&, ByVal lpName$, ByRef lpcbName&, ByVal lpReserved&, ByVal lpClass$, ByRef lpcbClass&, ByRef lpftLastWriteTime As FILETIME)

' ファイルタイムをシステムタイムに変換
Declare Function Api_FileTimeToSystemTime& Lib "kernel32" Alias "FileTimeToSystemTime" (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME)

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

Var Shared List1 As Object
Var Shared Button1 As Object

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

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var hSubKey As Long
    Var RegSubKey As String
    Var RegEnumSubKey As String
    Var SubKeyNameLen As Long
    Var ft As FILETIME
    Var st As SYSTEMTIME
    Var FileTime As String
    Var i As Long
    Var Ret As Long
    
    'リストを初期化
    List1.Resetcontent

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

    'レジストリを読み取りモードでオープン
    Ret = Api_RegOpenKeyEx(HKEY_LOCAL_MACHINE, RegSubKey, 0, KEY_ENUMERATE_SUB_KEYS, hSubKey)

    'オープンエラーのときは
    If Ret <> ERROR_SUCCESS Then
        'エラーを表示して終了
        List1.AddString "オープンできませんでした。"
        Exit Sub
    End If

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

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

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

        'インデックスで指定したサブキーを取得
        Ret = Api_RegEnumKeyEx(hSubKey, i, RegEnumSubKey, SubKeyNameLen, 0, ByVal 0, 0, ft)

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

        'ファイル時間をシステム時間に変換
        Ret = Api_FileTimeToSystemTime(ft, st)

        'レジストリ情報を表示
        RegEnumSubKey = Left$(RegEnumSubKey, InStr(RegEnumSubKey, Chr$(0)) - 1)

        'ファイルの最終書き込み日時を編集
        FileTime = Trim$(Str$(st.wYear)) & "/" & Trim$(Str$(st.wMonth)) & "/" & Trim$(Str$(st.wDay)) & "(" & KMid$("日月火水木金土", st.wDayOfWeek + 1, 1) & ") " & Trim$(Str$(st.wHour)) & ":" & Trim$(Str$(st.wMinute)) & ":" & Trim$(Str$(st.wSecond))
        List1.AddString Format$(RegEnumSubKey, "&        & ") & FileTime

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

    'オープンしたレジストリをクローズ
    Ret = Api_RegCloseKey(hSubKey)
End Sub

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