发信人: xf-hsm()
整理人: fishy(2000-06-08 15:43:48), 站内信件
|
【 在 linchao (Touhu) 的大作中提到: 】
: 【 在 wyxgames (wyx) 的大作中提到: 】
: : 用VB6.0函数可以访问注册表的指定项,但是如何用Windows API函数
: : 完全访问注册表?
:
: .......
看看我以前写的文章对你可有帮助:
关于注册表的API
注册表,是Windows的一个重要的信息数据库。
关于注册表的API:
1、RegOpenKeyEx 打开指定的主键
2、RegCloseKey 关闭指定的主键
3、RegCreateKeyEx 新建指定的主键,若该主键已存在,则打开它
4、RegDeleteKey 删除指定的主键
5、RegDeleteValue 删除一个有名字的值
6、RegEnumKeyEx 枚举一指定的打开的主键中个子键,并得到子键
信息(用于查找)
7、RegEnumValue 枚举一指定的打开的主键下的值,并得到值的信
息(用于查找)
8、RegQueryInfoKey 取得指定主键的详细信息
9、RegQueryValueEx 取得指定主键下指定值的详细信息
10、RegSetValueEx 设置一指定的打开的主键下的值
还有个RegFlushKey是将指定的打开的主键的全部属性写入磁盘,相当于关闭 该主
键。但Close并不写入磁盘。建议使用RegCloseKey。
以上均为32位的函数,16位的就不做介绍了。(相信没人用Win32了吧? )
使用方法:
1、RegOpenKeyEx(
ByVal hKey As Long, 根键句柄
ByVal lpSubKey As String, 要打开的键名
ByVal ulOptions As Long, 保留,必须置0
ByVal samDesired As Long, 访问权限
phkResult As Long 打开之后所得到的句柄
)
根键句柄
就是根键常量
HKEY_CLASSES_ROOT = &H80000000
HKEY_CURRENT_USER = &H80000001
HKEY_LOCAL_MACHINE = &H80000002
HKEY_USERS = &H80000003
要打开的主键是在那个根键下的?
要打开的键名
……………………不用说了吧?
注意:根键不用写了,因为上面已经有了。
访问权限
是只读?还是要写?
恩,根据经验,其实置0就可以又读又写的了。
推荐置0。
打开之后所得到的句柄
输出量
结果啦!以后其他函数要用的!很重要!
例:
要打开“HKEY_CLASSES_ROOT\\TXTFILE\SHELL"
Dim Hkey as Long
Dim ReturnH as Long
returnh=RegOpenKeyEx(&H80000000,"txtfile\shell",0,0,hkey)
记住:打开的键,用完要关闭。
2、RegCloseKey(
ByVal hKey As Long 已经打开的键的句柄
)
例:
将上面打开的键关闭
returnh=RegCloseKey(hkey)
3、RegCreateKeyEx (
ByVal hKey As Long, 根键句柄
ByVal lpSubKey As String, 要新建或要打开的键名
ByVal Reserved As Long, 保留,必须置0
ByVal lpClass As String, 键的类名
ByVal dwOptions As Long, 新建主键的选项
ByVal samDesired As Long, 访问权限
lpSecurityAttributes As SECURITY_ATTRIBUTES,
安全属性
phkResult As Long, 打开之后所得到的句柄
lpdwDisposition As Long 执行情况
)
键的类名
至今我还没搞清楚此项有何用,望高手指教。
置空就得,不影响程序。
新建主键的选项
REG_OPTION_NON_VOLATILE = 0
REG_OPTION_VOLATILE = 1
根据经验,其实置0就可,不影响程序。
访问权限
是只读?还是要写?
恩,根据经验,其实置0就可以又读又写的了。
推荐置0。
安全属性
对此主键安全特性进行描述的一个结构,
至今我还没搞清楚此项有何用,望高手指教。
置空就得,不影响程序。
用法可见例子。
执行情况
REG_CREATED_NEW_KEY = &H1 为建立了个新键
REG_OPENED_EXISTING_KEY = &H2 为打开了一个已存在的主键
例:
在 HKEY_LOCAL_MACHINE 下新建一个 NewKey 子键
Dim Hkey as long
Dim Hend as long
Dim ReturnH as long
Dim SA As SECURITY_ATTRIBUTES
ReturnH = RegCreateKeyEx(&H80000002, "NewKey", 0, "", 0, 0, SA, Hkey, Hend)
其实如果只是新建一主键的话,用RegCreateKey就可以了。
4、RegDeleteKey(
ByVal hKey As Long, 已经打开的键的句柄
ByVal lpSubKey As String 欲删除的键名
)
例:
将上面新建的 NewKey 删除
ReturnH = RegDeleteKey(Hkey, "newkey")
最后关闭Hkey
5、RegDeleteValue(
ByVal hKey As Long, 已经打开的键的句柄
ByVal lpValueName As String 欲删除的值名
)
例:
将“HKEY_CLASSES_ROOT\\TXTFILE\SHELL”下值名为“play”的删除
先打开 HKEY_CLASSES_ROOT\\TXTFILE\SHELL……(略)
得到Hkey
ReturnH = RegDeleteValue(Hkey, "play")
最后关闭Hkey
6、RegEnumKeyEx(
ByVal hKey As Long, 已经打开的键的句柄
ByVal dwIndex As Long, 欲枚举主键的索引号
ByVal lpName As String, 主键名
lpcbName As Long, 主键名长度
lpReserved As Long, 保留,必须置0
ByVal lpClass As String, 键的类名
lpcbClass As Long, 类名长度
lpftLastWriteTime As FILETIME 上次修改的时间
)
欲枚举主键的索引号
若一主键下有许多子键,你想得到第3个子键的信息……
此值置3,
懂了吧!
主键名
返回量之一,
此变量必须声明为固定长度的字符串,
如 Dim ReturnS as string *100
主键名长度
函数调用前为设置主键名的长度,
调用后为主键名的真实长度。
键的类名、类名长度
都未知,置空即可。
上次修改的时间
为FILETIME类型的自定义变量。
例:
查看“HKEY_CLASSES_ROOT\\TXTFILE\SHELL”下的第一个子键的信息。(主要是 知道键名)
Dim ReturnH as long
Dim Returns as string *100
Dim Hkey as long
Dim FT as FILETIME
Dim I as long
Dim Rsize as long
I=0'索引号 0为第一个
Rsize=100
ReturnH = RegOpenKeyEx(&H80000000, "TXTFILE\SHELL", 0, 0, hKey)
ReturnH = RegEnumKeyEx(hKey, I, ReturnS, Rsize, 0, "", 0, FT)
ReturnH = RegCloseKey(hKey)
ReturnS即为第一个子键的名字
7、RegEnumValue(
ByVal hKey As Long, 已经打开的键的句柄
ByVal dwIndex As Long, 欲枚举值的索引号
ByVal lpValueName As String, 值名
lpcbValueName As Long, 值名长度
lpReserved As Long, 保留,必须置0
lpType As Long, 值的类型
lpData As Byte, 值的数值
lpcbData As Long 值的数值的长度
)
值名
返回量之一,
此变量必须声明为固定长度的字符串,
如 Dim ReturnS as string *128
值名长度
返回的值与实际的字符数相等。
值的类型、值的数值、值的数值的长度
估计是VB的BUG,以上几个参数在使用时有点儿小麻烦,设为常数方才正常。
若有高手知其原因望告之,谢谢!
例:
查看“HKEY_CURRENT_USER\RemoteAccess”主键下索引号为1的值的值名
Dim ReturnH As Long
Dim ReturnS As String * 100
Dim HKey As Long
Dim H1 As Long
H1=100 '值名长度
ReturnH = RegOpenKeyEx(&H80000001, "RemoteAccess", 0, 0, HKey)
ReturnH = RegEnumValue(HKey, 1, ReturnS, H1, 0, 0, 0, 100)
ReturnH = RegCloseKey(HKey)
8、RegQueryInfoKey(
ByVal hKey As Long, 已经打开的键的句柄
ByVal lpClass As String, 键的类名
lpcbClass As Long, 类名长度
lpReserved As Long, 保留,必须置0
lpcSubKeys As Long, 此键下子键的数量
lpcbMaxSubKeyLen As Long, 此键下最长子键的长度
lpcbMaxClassLen As Long, 此键下最长子键类名的长度
lpcValues As Long, 此键下值的数量
lpcbMaxValueNameLen As Long, 此键下最长值名的长度
lpcbMaxValueLen As Long, 此键下最长数据的长度
lpcbSecurityDescriptor As Long,安全属性
lpftLastWriteTime As FILETIME 上次修改的时间
)
键的类名、类名长度
至今我还没搞清楚这两项有何用,望高手指教。
置空就得,不影响程序。
此键下最长子键的长度
返回的值比实际的字符数多1。
此键下值的数量
不包括“默认”
此键下最长值名的长度
返回的值与实际的字符数相等。
此键下最长数据的长度
返回的值比实际值多1。
安全属性
对此主键安全特性进行描述的一个结构,
至今我还没搞清楚此项有何用,望高手指教。
置空就得,不影响程序。
例:
取“HKEY_CURRENT_USER\RemoteAccess”的详细信息
Dim ReturnH As Long
Dim HKey As Long
Dim H1 As Long '此键下子键的数量
Dim H2 As Long '此键下最长子键的长度
Dim H3 As Long '此键下值的数量
Dim H4 As Long '此键下最长值名的长度
Dim H5 As Long '此键下最长数据的长度
Dim FT As FILETIME
ReturnH = RegOpenKeyEx(&H80000001, "RemoteAccess", 0, 0, hKey)
ReturnH = RegQueryInfoKey(hKey, "", 0, 0, H1, H2, 0, H3, H4, H5, 0, FT )
ReturnH = RegCloseKey(hKey)
9、RegQueryValueEx(
ByVal hKey As Long, 已经打开的键的句柄
ByVal lpValueName As String, 值名
ByVal lpReserved As Long, 保留,必须置0
lpType As Long, 值的类型
lpData As Any, 值的数据
lpcbData As Long 值的数据的长度
)
值名
若取“默认”的值……看例子。
值的类型
REG_NONE = 0
REG_SZ = 1 字符串值
REG_EXPAND_SZ = 2
REG_BINARY = 3 二进制值
REG_DWORD = 4 DWORD值(双字)
REG_DWORD_LITTLE_ENDIAN = 4
REG_DWORD_BIG_ENDIAN = 5
REG_LINK = 6
REG_MULTI_SZ = 7
REG_RESOURCE_LIST = 8
Public Const REG_FULL_RESOURCE_DESCRIPTOR = 9
REG_RESOURCE_REQUIREMENTS_LIST = 10
一般只会用到:字符串值、二进制值、DWORD值三种类型。
值的数据
此参数需要在前面加ByVal,因为数值是按值传递的。
例:
取得“HKEY_CURRENT_USER\RemoteAccess”下“默认”的数据
Dim ReturnH As Long
Dim ReturnS As String * 100
Dim HKey As Long
Dim H1 As Long '值的类型
Dim H2 As Long '值的数据的长度
h1=REG_SZ '因为“默认”的类型是字符串REG_SZ = 1
h2=100
ReturnH = RegOpenKeyEx(&H80000001, "RemoteAccess", 0, 0, HKey)
ReturnH = RegQueryValueEx(HKey, "", 0, H1, ByVal ReturnS, H2)
ReturnH = RegCloseKey(HKey)
10、RegSetValueEx(
ByVal hKey As Long, 已经打开的键的句柄
ByVal lpValueName As String, 欲修改值的值名
ByVal Reserved As Long, 保留,必须置0
ByVal dwType As Long, 值的类型
lpData As Any, 值的数值
ByVal cbData As Long 值的数值的长度
)
值的数据
此参数需要在前面加ByVal,因为数值是按值传递的。
值的数值的长度
实际值多1。
例:
将“HKEY_CURRENT_USER\RemoteAccess”下“默认”的数据改为“12345”
Dim ReturnH As Long
Dim HKey As Long
ReturnH = RegOpenKeyEx(&H80000001, "RemoteAccess", 0, 0, HKey)
ReturnH = RegSetValueEx(HKey, "", 0, 1, ByVal "12345", 6)
ReturnH = RegCloseKey(HKey)
资料:(Visual Basic 5.0 企业版)
'函数声明
Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Lon g, ByVal samDesired As Long, phkResult As Long) As Long
Declare Function RegCloseKey Lib "advapi32.dll" Alias "RegCloseKey" (B yVal hKey As Long) As Long
Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKey ExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesir ed As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, phkResult As Long, lpdwDisposition As Long) As Long
Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteVal ueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
Declare Function RegQueryInfoKey Lib "advapi32.dll" Alias "RegQueryInf oKeyA" (ByVal hKey As Long, ByVal lpClass As String, lpcbClass As Long , lpReserved As Long, lpcSubKeys As Long, lpcbMaxSubKeyLen As Long, lp cbMaxClassLen As Long, lpcValues As Long, lpcbMaxValueNameLen As Long, lpcbMaxValueLen As Long, lpcbSecurityDescriptor As Long, lpftLastWrit eTime As FILETIME) As Long
Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryVal ueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReser ved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, l pcbName As Long, lpReserved As Long, ByVal lpClass As String, lpcbClas s As Long, lpftLastWriteTime As FILETIME) As Long
Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As Stri ng, lpcbValueName As Long, lpReserved As Long, lpType As Long, lpData As Byte, lpcbData As Long) As Long
Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueEx A" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As L ong
'根键常量
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 KEY_QUERY_VALUE = &H1
Public Const KEY_SET_VALUE = &H2
Public Const KEY_CREATE_SUB_KEY = &H4
Public Const KEY_ENUMERATE_SUB_KEYS = &H8
Public Const KEY_NOTIFY = &H10
Public Const KEY_CREATE_LINK = &H20
Public Const KEY_ALL_ACCESS =&H3F
'建立主键选项
Public Const REG_OPTION_NON_VOLATILE = 0
Public Const REG_OPTION_VOLATILE = 1
'数值类型常量
Public Const REG_NONE = 0
Public Const REG_SZ = 1
Public Const REG_EXPAND_SZ = 2
Public Const REG_BINARY = 3
Public Const REG_DWORD = 4
Public Const REG_DWORD_LITTLE_ENDIAN = 4
Public Const REG_DWORD_BIG_ENDIAN = 5
Public Const REG_LINK = 6
Public Const REG_MULTI_SZ = 7
Public Const REG_RESOURCE_LIST = 8
Public Const REG_FULL_RESOURCE_DESCRIPTOR = 9
Public Const REG_RESOURCE_REQUIREMENTS_LIST = 10
'错误代码
Public Const ERROR_SUCCESS = 0&
Public Const ERROR_ACCESS_DENIED = 5&
Public Const ERROR_NO_MORE_ITEMS = 259&
'结构类型
Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
-- 火焰の纹章Ⅲ
汉化中……
花生米 http://fe5.yeah.net
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.102.116.198]
|
|