はじめまして、勝と申します。
Windows98では、HKEY_CURRENT_USERにキーを作成しても上手く書き込み
できるのですが、Windows2000では、何故か書き込みが行われません。
理由が分かる方がいらっしゃいましたら、ご教授お願いします。
因みに環境は
Windows2000
VisualBasic6.0
です。
アクセス権あたりではないですか?
試しに
regedit を起動して、直接
キーを作成したりすることはできますか?
早速のご回答有り難うございます。
Regeditで直接キーを作成することはできます。
Administratorでログインしても実行しても結果は同じなので・・・
実際のコードを提示してください。
度々で申し訳有りません。
モジュールにして使用しています。以下のコードがそれです。
矢張り、環境によるものでしょうか?
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, ByVal lpData As Any, lpcbData As Long) As Long ' Note that if you declare the lpData parameter as String, you must pass it By Value.
Private Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, lpSecurityAttributes As Long, phkResult As Long, lpdwDisposition 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 ' Note that if you declare the lpData parameter as String, you must pass it By Value.
Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Const STANDARD_RIGHTS_ALL = &H1F0000
Private Const KEY_QUERY_VALUE = &H1
Private Const KEY_ENUMERATE_SUB_KEYS = &H8
Private Const KEY_NOTIFY = &H10
Private Const KEY_CREATE_SUB_KEY = &H4
Private Const KEY_CREATE_LINK = &H20
Private Const KEY_SET_VALUE = &H2
Private Const SYNCHRONIZE = &H100000
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 Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_CURRENT_CONFIG = &H80000005
Public Const HKEY_DYN_DATA = &H80000006
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
Private Const ERROR_SUCCESS = 0&
Private Const REG_SZ = 1 ' Unicode nul terminated string
'**************************************************
'* 関数名 : GetRegKey
'* 引 数 : lngRootKey ルートキー
'* strSubKey サブキー
'* strValueName 値名
'* 戻り値 : 取得した文字列
'**************************************************
Public Function GetRegKey(ByVal lngRootKey As Long, ByVal strSubkey As String, _
ByVal strValueName As String) As String
Dim lngRet As Long '戻り値
Dim lngHnd As Long
Dim strValue As String '取得文字列
Dim lngLength As Long '文字長
'キーをオープンしてハンドルを得る
lngRet = RegOpenKeyEx(lngRootKey, strSubkey, 0&, KEY_ALL_ACCESS, lngHnd)
'バッファを確保する
strValue = String$(250, Chr$(0))
lngLength = Len(strValue)
'値を得る
lngRet = RegQueryValueEx(lngHnd, strValueName, 0&, 0&, strValue, lngLength)
If lngRet = ERROR_SUCCESS Then
GetRegKey = strValue
End If
'ハンドルを閉じる
Call RegCloseKey(lngHnd)
End Function
'**************************************************
'* 関数名 : SetRegKey
'* 引 数 : lngRootKey ルートキー
'* strSubKey サブキー
'* strValueName 値名
'* strSetValue 値
'* 戻り値 : True 正常
'* False 異常
'**************************************************
Public Function SetRegKey(ByVal lngRootKey As Long, ByVal strSubkey As String, _
ByVal strValueName As String, ByVal strSetValue As String) As Boolean
Dim lngRet As Long '戻り値
Dim lngHnd As Long
Dim lngDisp As Long
Dim lngResult As Long
Dim lngLength As Long '文字長
lngLength = Len(strSetValue)
'キーを作成する
lngRet = RegCreateKeyEx(lngRootKey, strSubkey, 0&, vbNullString, 0&, KEY_ALL_ACCESS, 0&, lngResult, lngDisp)
'キーをオープンしてハンドルを得る
lngRet = RegOpenKeyEx(lngRootKey, strSubkey, 0&, KEY_ALL_ACCESS, lngHnd)
'値を書き込む
lngRet = RegSetValueEx(lngHnd, strValueName, 0&, REG_SZ, strSetValue, lngLength)
'ハンドルを閉じる
Call RegCloseKey(lngHnd)
If lngRet = ERROR_SUCCESS Then
SetRegKey = True
Else
SetRegKey = False
End If
End Function
'**************************************************
'* 関数名 : DeleteRegKey
'* 引 数 : lngRootKey ルートキー
'* strSubKey サブキー(省略可)
'* 戻り値 : 0 正常
'* 0以外 異常
'**************************************************
Public Function DeleteRegKey(ByVal lngRootKey As Long, Optional ByVal strSubkey As String = "")
'レジストリを削除する
DeleteRegKey = RegDeleteKey(lngRootKey, strSubkey)
End Function
現在のコードですと、RegCreateKeyExを呼び出した時に、その戻り値が、
正常を表す 0 ではなく、引数が間違っている事を表す 87 に
なっているのではないでしょうか?
RegCreateKeyExをDeclareする際に、第7引数を『phkResult As Long』
すなわち『ByRef phkResult As Long』として宣言していますよね。
それなのに、それを呼び出す際に『0&』を渡しているのが原因かと思います。
呼び出し側を、『ByVal 0&』にするか、もしくは、Declare側に
ByValを付加してみてください。
魔界の仮面弁士さん、とろさん 有り難うございました。
ご指摘どおり、戻り値が 87 になっていました。
呼び出し側に『ByVal』を付けると解決できました。
また、何かあれば宜しくお願いします。
ツイート | ![]() |