VB 通过API访问 Windows 注册表

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 iamfancy 的 blog

你希望你的程序能访问 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

本文关键:VB API 注册表
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top