WIN32汇编语言教程:第15章 注册表和INI文件 · 15.3 对注册表的操作(2)

例子程序对HKEY_LOCAL_MACHINE根键进行操作,当在“键名”一栏中输入子键名称字符串并在“键值名”一栏输入键值名称后,按下“读取键值”按钮,如果指定子键中存在这个键值项,程序会读出键值数据并显示在“键值”一栏中;如果按下“删除键值”按钮,那么对应键值项被删除;读者也可以在“键值”一栏中输入其他数据并选定“类型”,然后按下“保存键值”按钮将新的键值数据设置到注册表中。

例子程序也可以对子键进行操作。在对话框最下面的“子键名”一栏中输入子键名称,按下“创建子键”的话,函数会在“键名”一栏指定的键下面创建子键,如果按下“删除子键”按钮,那么“键名”指定的键下面由“子键名”指定的子键会被删除。

每次进行操作以后,程序将“键名”指定的键下面的全部子键和键值项列在编辑框中,以便让用户看到操作的结果。

这里列出了资源脚本文件和源代码。Reg.rc文件定义了如图15.3所示的对话框,文件内容如下:

//##################################################################

#include                <resource.h>

//##################################################################

#define ICO_MAIN                  1000

#define DLG_MAIN                  1000

#define IDC_KEY              1001

#define IDC_VALUENAME         1002

#define IDC_VALUE             1003

#define IDC_TYPE                  1004

#define IDC_KEYLIST           1005

#define IDC_SUBKEY            1006

#define IDC_REMOVE_VALUE       1007

#define IDC_GET_VALUE         1008

#define IDC_SET_VALUE         1009

#define IDC_CREATE_SUBKEY      1010

#define IDC_REMOVE_SUBKEY      1011

//##################################################################

ICO_MAIN          ICON             "Main.ico"

//##################################################################

DLG_MAIN DIALOG 205, 107, 245, 206

STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU

CAPTION "注册表操作"

FONT 9, "宋体"

{

 RTEXT "键名 HKEY_LOCAL_MACHINE\", -1, 9, 9, 105, 8

 EDITTEXT IDC_KEY, 118, 7, 121, 12, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP

 RTEXT "键值名", -1, 4, 26, 30, 8

 EDITTEXT IDC_VALUENAME, 39, 24, 139, 12, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP

 RTEXT "键值", -1, 4, 43, 30, 8

 EDITTEXT IDC_VALUE, 39, 41, 201, 12, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP

 RTEXT "类型", -1, 4, 59, 30, 8

 COMBOBOX IDC_TYPE, 39, 58, 78, 77, CBS_DROPDOWNLIST | WS_TABSTOP

 LTEXT "当前键下的所有的子键名:", -1, 8, 78, 141, 8

 EDITTEXT IDC_KEYLIST, 6, 92, 232, 91, ES_MULTILINE | ES_AUTOVSCROLL |
    ES_AUTOHSCROLL | ES_READONLY | WS_BORDER | WS_VSCROLL | WS_TABSTOP

 RTEXT "子键名", -1, 7, 191, 30, 8

 EDITTEXT IDC_SUBKEY, 42, 189, 73, 12, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP

 PUSHBUTTON "删除键值", IDC_REMOVE_VALUE, 183, 23, 57, 14

 PUSHBUTTON "读取键值", IDC_GET_VALUE, 122, 57, 57, 14

 PUSHBUTTON "保存键值", IDC_SET_VALUE, 183, 57, 57, 14

 PUSHBUTTON "创建子键", IDC_CREATE_SUBKEY, 121, 188, 57, 14

 PUSHBUTTON "删除子键", IDC_REMOVE_SUBKEY, 182, 188, 57, 14

}

//##################################################################

汇编源代码Reg.asm的内容如下:

                 .386

                 .model flat, stdcall

                 option casemap :none

;####################################################################

; Include 文件定义

;####################################################################

include       windows.inc

include       user32.inc

includelib    user32.lib

include       kernel32.inc

includelib    kernel32.lib

include       Advapi32.inc

includelib    Advapi32.lib

;####################################################################

; Equ 等值定义

;####################################################################

ICO_MAIN                 equ 1000

DLG_MAIN                 equ 1000

IDC_KEY              equ 1001

IDC_VALUENAME        equ 1002

IDC_VALUE            equ 1003

IDC_TYPE                 equ 1004

IDC_KEYLIST           equ 1005

IDC_SUBKEY            equ 1006

IDC_REMOVE_VALUE         equ 1007

IDC_GET_VALUE         equ 1008

IDC_SET_VALUE         equ 1009

IDC_CREATE_SUBKEY     equ 1010

IDC_REMOVE_SUBKEY     equ 1011

;####################################################################

; 数据段

;####################################################################

                .data?

hInstance     dd    ?

hWinMain          dd    ?

                .const

szTypeSz          db    'REG_SZ',0

szTypeDw          db    'REG_DWORD',0

szFmtSubkey    db     '【子键】%s',0dh,0ah,0

szFmtSz        db     '【键值】%s=%s (REG_SZ 类型)',0dh,0ah,0

szFmtDw        db     '【键值】%s=%08X (REG_DWORD 类型)',0dh,0ah,0

szFmtValue     db     '【键值】%s (其他类型)',0dh,0ah,0

szNotSupport       db     '程序暂不显示其他类型的键值!',0

;####################################################################

; 代码段

;####################################################################

                  .code

include       _Reg.asm

;####################################################################

_EnumKey          proc   _lpKey

                 local  @hKey,@dwIndex,@dwLastTime:FILETIME

                local  @szBuffer1[512]:byte

             local  @szBuffer[256]:byte

             local  @szValue[256]:byte

             local  @dwSize,@dwSize1,@dwType

 

      mov    @dwIndex,0

      invoke SetDlgItemText,hWinMain,IDC_KEYLIST,NULL

;********************************************************************

; 枚举子键

;********************************************************************

      invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,_lpKey,NULL,\

             KEY_ENUMERATE_SUB_KEYS,addr @hKey

      .if eax == ERROR_SUCCESS

             .while TRUE

                     mov    @dwSize,sizeof @szBuffer

                    invoke RegEnumKeyEx,@hKey,@dwIndex,addr @szBuffer,\

                               addr @dwSize,NULL,NULL,NULL,NULL

                     .break .if eax == ERROR_NO_MORE_ITEMS

                     invoke wsprintf,addr @szBuffer1,\

                             addr szFmtSubkey,addr @szBuffer

                     invoke SendDlgItemMessage,hWinMain,IDC_KEYLIST,\

上页:第15章 注册表和INI文件 · 15.3 对注册表的操作(1) 下页:第15章 注册表和INI文件 · 15.3 对注册表的操作(3)

第15章 注册表和INI文件

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