WIN32汇编语言教程:第15章 注册表和INI文件 · 15.3 对注册表的操作(4)
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
;####################################################################
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,eax,DLG_MAIN,\
NULL,offset _ProcDlgMain,NULL
invoke ExitProcess,NULL
;####################################################################
end start
注册表函数是一组函数名以Reg开头的函数,全部函数包含在Advapi32.dll文件中,所以在源程序的一开始要使用include和includelib语句将Advapi32.inc文件和Advapi32.lib文件包含进来。
例子程序中将把注册表的各种操作分别写成子程序,用_RegQueryValue,_RegSetValue和_RegDelValue子程序来查询、设置和删除键值,用_RegCreateKey和_RegDelSubKey完成子键的创建和删除工作,并在WM_COMMAND消息中根据不同的按钮消息调用相应的子程序。为了让读者不经修改就可以将这些子程序用在其他程序中,将这些子程序放在一个单独的_Reg.asm文件中并在主程序中使用include语句包含进来,文件内容如下:
;####################################################################
; _Reg.asm 文件
;####################################################################
; 查询键值
;####################################################################
_RegQueryValue proc _lpszKey,_lpszValueName,\
_lpszValue,_lpdwSize,_lpdwType
local @hKey,@dwReturn
mov @dwReturn,-1
invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,_lpszKey,NULL,\
KEY_QUERY_VALUE,addr @hKey
.if eax == ERROR_SUCCESS
invoke RegQueryValueEx,@hKey,_lpszValueName,NULL,\
_lpdwType,_lpszValue,_lpdwSize
mov @dwReturn,eax
invoke RegCloseKey,@hKey
.endif
mov eax,@dwReturn
ret
_RegQueryValue endp
;####################################################################
; 设置键值
;####################################################################
_RegSetValue proc _lpszKey,_lpszValueName,_lpszValue,\
_dwValueType,_dwSize
local @hKey
invoke RegCreateKey,HKEY_LOCAL_MACHINE,_lpszKey,addr @hKey
.if eax == ERROR_SUCCESS
invoke RegSetValueEx,@hKey,_lpszValueName,NULL,\
_dwValueType,_lpszValue,_dwSize
invoke RegCloseKey,@hKey
.endif
ret
_RegSetValue endp
;####################################################################
; 创建子键
;####################################################################
_RegCreateKey proc _lpszKey,_lpszSubKeyName
local @hKey,@hSubkey,@dwDisp
invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,_lpszKey,NULL,\
KEY_CREATE_SUB_KEY,addr @hKey
.if eax == ERROR_SUCCESS
invoke RegCreateKeyEx,@hKey,_lpszSubKeyName,NULL,\
NULL,NULL,NULL,NULL,addr @hSubkey,addr @dwDisp
invoke RegCloseKey,@hKey
invoke RegCloseKey,@hSubkey
.endif
ret
_RegCreateKey endp
;####################################################################
; 删除键值
;####################################################################
_RegDelValue proc _lpszKey,_lpszValueName
local @hKey
invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,_lpszKey,NULL,\
KEY_WRITE,addr @hKey
.if eax == ERROR_SUCCESS
invoke RegDeleteValue,@hKey,_lpszValueName
invoke RegCloseKey,@hKey
.endif
ret
_RegDelValue endp
;####################################################################
; 删除子键
;####################################################################
_RegDelSubKey proc _lpszKey,_lpszSubKeyName
local @hKey
invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,_lpszKey,NULL,\
KEY_WRITE,addr @hKey
.if eax == ERROR_SUCCESS
invoke RegDeleteKey,@hKey,_lpszSubKeyName
invoke RegCloseKey,@hKey
.endif
ret
_RegDelSubKey endp
;####################################################################
1. 打开和关闭子键
注册表函数对注册表的操作是通过句柄来完成的,与文件操作一样,在对某个键下的子键或者键值项进行操作之前,需要先将这个键打开,然后使用键句柄来引用这个键,在操作完毕以后再将键句柄关闭。注册表的根键不需要打开,它们的句柄是固定不变的,要使用根键的时候只要把这些句柄直接拿来用就是了,Windows.inc中已经预定义了它们的数值:
HKEY_CLASSES_ROOT equ 80000000h
HKEY_CURRENT_USER equ 80000001h
HKEY_LOCAL_MACHINE equ 80000002h
HKEY_USERS equ 80000003h
HKEY_PERFORMANCE_DATA equ 80000004h
HKEY_CURRENT_CONFIG equ 80000005h
HKEY_DYN_DATA equ 80000006h
在程序中可以随时将这些助记符当做句柄来引用对应的根键。在程序结束的时候,不需要关闭这些根键句柄。
打开子键使用RegOpenKeyEx函数,在Win16中还存在一个RegOpenKey函数,虽然在Win32中这个函数仍然存在,但这仅是为了兼容的目的而设置的。API手册中推荐使用RegOpenKeyEx函数:
invoke RegOpenKeyEx,hKey,lpSubKey,dwOptions,samDesired,phkResult
上页:第15章 注册表和INI文件 · 15.3 对注册表的操作(3) 下页:第15章 注册表和INI文件 · 15.3 对注册表的操作(5)