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)