#283 任意のレジストリキーにアクセスするには? VBA、API

VBAのSaveSettingステートメントやGetSetting関数では、あらかじめ決められたキー、
「HKEY_CURRENT_USER\Software\VB and VBA Program Settings」
の下のエントリしか操作できません。しかし、WindowsAPIを使えば、どんなレジストリでも操作することができます。

以下の「SetRegValue」と「GetRegValue」の2つのプロシージャは、「#154 Accessのレジストリ情報を直接書き換える方法」の内容を、より汎用的なプロシージャとして拡張したものです。標準モジュールに書くことを前提としています。

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 RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" _
          (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, _
          ByVal dwType As Long, ByVal lpData As Any, ByVal cbData 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 Const ERROR_SUCCESS = 0
Private Const REG_SZ = 1
Private Const KEY_QUERY_VALUE = &H1
Private Const KEY_SET_VALUE = &H2
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 Function SetRegValue(lngRootKey As Long, strSubKey As String, _
                    strName As String, strValue As String)

'概要 レジストリに値を設定する
'引数 lngRootKey : レジストリルートキー
'     strSubKey  : レジストリサブキー
'     strName    : 名前
'     strValue   : 設定する値
'返値 成功時 True、失敗時 False

  Dim lngRet As Long
  Dim hWnd As Long

  'ハンドルを開く
  hWnd = Application.hWndAccessApp
  lngRet = RegOpenKeyEx(lngRootKey, strSubKey, 0, KEY_SET_VALUE, hWnd)
  '値を設定
  lngRet = RegSetValueEx(hWnd, strName, 0, REG_SZ, ByVal strValue, LenB(strValue))
  'ハンドルを閉じる
  RegCloseKey hWnd
  
  'エラーを確認して返り値に設定
  SetRegValue = (lngRet = ERROR_SUCCESS)

End Function


Public Function GetRegValue(lngRootKey As Long, strSubKey As String, _
                    strName As String) As String

'概要 レジストリの値を取得する
'引数 lngRootKey : レジストリルートキー
'     strSubKey  : レジストリサブキー
'     strName    : 名前
'返値 取得したレジストリの値

  Dim lngRet As Long
  Dim hWnd As Long
  Dim strValue As String

  'ハンドルを開く
  hWnd = Application.hWndAccessApp
  lngRet = RegOpenKeyEx(lngRootKey, strSubKey, 0, KEY_QUERY_VALUE, hWnd)
  '受け取り値用のバッファを確保
  strValue = String(255, " ")
  '値を取得
  lngRet = RegQueryValueEx(hWnd, strName, 0, 0, ByVal strValue, LenB(strValue))
  'ハンドルを閉じる
  RegCloseKey hWnd
  
  '取得した値から後続のNullを取り除く
  strValue = Left(strValue, InStr(strValue, vbNullChar) - 1)
  '取得した値を返り値に設定
  GetRegValue = strValue

End Function

各プロシージャの呼び出し例:
Sub RegTest()

  Dim strRegValue As String

  'デスクトップの壁紙のファイル名をレジストリより取得
  strRegValue = GetRegValue(HKEY_CURRENT_USER, "Control Panel\desktop", "Wallpaper")
  Debug.Print strRegValue

  '新しい壁紙のファイル名をレジストリに設定
  strRegValue = "C:\Windows\大草原の風.bmp"
  SetRegValue HKEY_CURRENT_USER, "Control Panel\desktop", "Wallpaper", strRegValue

End Sub

※このサンプルプログラムの場合、実際にはデスクトップの壁紙は変更されません。変更後のレジストリの値が反映されていないためです。変更値を反映させるためには、Windowsを再起動するか、「SystemParametersInfo」API関数を使って再起動せずに反映させる必要があります。今回はレジストリの取得と設定の説明ですので、それに関しては割愛します。
| Index | Prev | Next |

この情報は参考になりましたか?、問題は解決しましたか?、もしまだなら......
T'sWareのワンポイトテクニカルアドバイスをご利用ください。3000円/件〜でご支援します。
スタンドアロンからSQL Server対応まで、オーダーメイドのシステムを短納期・安価でお届けします
 

Copyright © T'sWare All rights reserved