你希望你的程序能访问 windows 注册表吗?当然,能访问庞大的 windows 注册表是每个程序设计者都希望的事情,那么我就告诉你如何通过api函数访问 windows 注册表吧。请先看看下面的 visual basic 程序:
'根键常数
const hkey_classes_root = -2147483648#
const hkey_current_user = -2147483647#
const hkey_local_machine = -2147483646#
const hkey_users = -2147483645#
'键值类型
const reg_sz = 1& '字符串值
const reg_binary = 3& '二进制值
const reg_dword = 4& 'dword 值
'声明有关api函数
private declare function regcreatekey lib "advapi32.dll" alias "regcreatekeya" _
( _
byval hkey as long, _
byval lpsubkey as string, _
byref phkresult as long _
) as long '建立一个新的主键
private declare function regopenkey lib "advapi32.dll" alias "regopenkeya" _
( _
byval hkey as long, _
byval lpsubkey as string, _
byref phkresult as long _
) as long '打开一个主键
private declare function regdeletekey lib "advapi32.dll" alias "regdeletekeya" _
( _
byval hkey as long, _
byval lpsubkey as string _
) as long '删除一个主键
private declare function regclosekey lib "advapi32.dll" _
( _
byval hkey as long _
) as long '关闭一个主键
private declare function regsetvalueex lib "advapi32.dll" alias "regsetvalueexa" _
( _
byval hkey as long, _
byval lpvaluename as string, _
byval reserved as long, _
byval dwtype as long, _
byval lpdata as any, _
byval cbdata as long _
) as long '创建或改变一个键值,lpdata应由缺省的byref型改为byval型
private declare function regqueryvalueex lib "advapi32.dll" alias "regqueryvalueexa" _
( _
byval hkey as long, _
byval lpvaluename as string, _
byval lpreserved as long, _
byref lptype as long, _
byval lpdata as any, _
byref lpcbdata as long _
) as long '查询一个键值,lpdata应由缺省的byref型改为byval型
private declare function regdeletevalue lib "advapi32.dll" alias "regdeletevaluea" _
( _
byval hkey as long, _
byval lpvaluename as string _
) as long '删除一个键值
'主过程
sub main()
dim nkeyhandle as long, nvaluetype as long, nlength as long
dim svalue as string
svalue = "i am a winner!"
call regcreatekey(hkey_current_user, "new registry key", nkeyhandle)
call regsetvalueex(nkeyhandle, "my value", 0, reg_sz, svalue, 255)
svalue = space(255)
nlength = 255
call regqueryvalueex(nkeyhandle, "my value", 0, nvaluetype, svalue, nlength)
msgbox svalue
call regdeletevalue(nkeyhandle, "my value")
call regdeletekey(hkey_current_user, "new registry key")
call regclosekey(nkeyhandle)
end sub
来看看程序运行的结果:
在注册表的 hkey_current_user 根键中多了一个 new registry key 主键。其中除有一个空的“(默认)”值外,还有一个值为“i am a winner!”的“my value”值
下面我们来分析一下这个程序:
首先是定义常量。前面四个常量是各根键的句柄,这些句柄都是固定的;后三个是键值类型,在注册表编辑器中右键单击主键弹出的“新建”菜单项中,可以看到这三个键值类型。
第二步是声明api函数。这一步可以通过“api 文本浏览器”来完成:用“api 文本浏览器”加载文件“win32api.txt”,查找出上例中的 api 函数并添加到“选定项”一栏中,点取“复制”按钮,再回到 vb 程序编辑环境,将剪贴板中的内容粘贴到vb程序编辑器中,这样就完成了 api 函数的声明过程。值得注意的是,“regsetvalueex”和“ regqueryvalueex”两个函数中的“lpdata”被定义为“any”类型的,却没有定义传递方式,于是它被默认为“byref”传递方式。经笔者测试,这样不能正确的设置或查询键值,但将其传递方式改为“byval”后,便 ok 了。
第三步便是在访问注册表了。“regopenkey”的用法与“regcreatekey”的用法是类似的,前者用于打开一个已存在的主键,而后者除了能用于打开一个已存在的主键外,如果该主键不存在,还能创建这个主键。打开或创建主键成功后将返回一个句柄给参数“phkresult”,这个句柄将在对键值的操作中用到,它就是“regsetvalueex”、“regqueryvalueex”和“regdeletevalue”中的“nkeyhandle”参数。 还有一点需要说明,每个主键中都有一个键值名显示为“(默认)”,但其键值名并不就是“(默认)”,而是一个空字符串。
现在,你知道怎样通过api函数访问windows注册表了吗?
-=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-
/\
__________/lb\___ outinn
/ _[]_ /____\ \
/_________/| () |\__\ http://outinn.yeah.net/
| ____ /-| __ |-\| welcome to visit outinn!
|__|==|___| || |__|
-=--=--=- |_||_| =- fancy, outinn@china.com