#154 | Accessのレジストリ情報を直接書き換える方法 | VBA、API | |
AccessのVBAによるレジストリ操作というと、レジストリに値を保存するSaveSettingステートメントと、保存されている値を読み出すGetSetting関数がありますが、これらはともに HKEY_USERS\.Default\Software\VB and VBA Program Settings というキーの下が対象になります(「#060 フォームを前回閉じたときのプロパティ値を復元するには?」を参照)。 しかし、これ以外のキーを書き換えたいという場合にはどうしたらよいのでしょうか?。それには、Windows APIを使います。 次の例では、Accessのオプションの[全般]タブにある「既定のデータベース フォルダ」の現在値をイミディエイトウィンドウに表示したあと、"C:\My Documents"に書き換えてみます。 このオプション値は、レジストリの、 HKEY_CURRENT_USER\Software\Microsoft\Office\9.0\Access\Settings\ というキーの「Default Database Directory」という値に保存されています。 まず、Windows APIを使うための宣言として、標準モジュールに次のコードを記述します。"Declare"の前に"Private"を付けることによってフォームのモジュールにも記述できます。 Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" _
(ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long 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 Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" _ (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, _ ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long Declare Function RegCloseKey Lib "advapi32.dll" _ (ByVal hKey As Long) As Long Const HKEY_LOCAL_MACHINE = &H80000002 Const HKEY_CURRENT_USER = &H80000001 Const ERROR_SUCCESS = 0& Const REG_SZ = 1 次のコードが実際にレジストリの書き換えを行うサンプルプロシージャです。 Sub RegTest()
'レジストリ書き換えのサンプル Dim lngKey As Long Dim strRegData As String Dim strNewData As String Const cBufferSize As Long = 256 'キー Const cstrRegKey As String = "Software\Microsoft\Office\9.0\Access\Settings\" 'サブキー(値) Const cstrSubKey As String = "Default Database Directory" 'レジストリキーをオープン If RegOpenKey(HKEY_CURRENT_USER, cstrRegKey, lngKey) = ERROR_SUCCESS Then '現在のデータを取得 RegQueryValueEx lngKey, cstrSubKey, 0&, 0&, ByVal 0&, cBufferSize strRegData = String$(cBufferSize, vbNullChar) If RegQueryValueEx(lngKey, cstrSubKey, 0&, 0&, _ ByVal strRegData, cBufferSize) = ERROR_SUCCESS Then strRegData = Left$(strRegData, InStr(strRegData, vbNullChar) - 1) Debug.Print strRegData End If '新しいデータに書き換え strNewData = "C:\My Documents" RegSetValueEx lngKey, cstrSubKey, 0&, REG_SZ, ByVal strNewData, cBufferSize 'レジストリキーをクローズ RegCloseKey lngKey End If End Sub ※このコードを実行した直後、Accessのオプション画面を見ても、その値は変更されていません。Accessが起動したときにすでにレジストリの値が読み込まれ、保持されているためです。Accessをいったん終了して、再起動してから変更されていることを確認してみて下さい。・・・・・レジストリエディタなら直ちに変更を確認することができます。 ※cstrRegKeyなどの定数や、変数 strNewData の部分をこのプロシージャの引数にすることによって、より汎用的な"レジストリ更新"プロシージャにすることができます。 |
|||
|
Copyright © T'sWare All rights reserved |