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)

第15章 注册表和INI文件

版权所有 © 云南伯恩科技 证书:粤ICP备09170368号