说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

读取和修改Windows注册表 -VB资料

HTML文档下载 WORD文档下载 PDF文档下载
读取和修改Windows注册表 -VB资料
使用Visual Basic读取和修改Windows注册表

  在过去,Visual Basic应用程序的开发者们对于如何在两次应用程序的运行之间保留状态信息感到非常的困难。这是因为基于Microsoft Windows的应用程序(包括Visual Basic)需要将应用程序的状态信息写入到一个文本文件(*.INI文件)中,且需要经常对这些文件中的文本进行分析,以包含有用的状态信息。

  现在,随着Windows95以及WindowsNT这类32位操作系统的到来,应用程序可以通过使用一个叫做Windows注册表的存储场所来保留应用程序的状态信息,并且将它们自己注册在系统之中。通过位于ADVAPI32.DLL中的C语言应用程序编程接口(APIs),对注册库的提取和修改变得非常容易。这对于使用C和C++的程序员来说真是太好了,不过对于那些使用其它编程语言,例如Visual Basic的程序员来说,使用这些编程接口还需要进行许多额外的工作。

  作为一个VB程序员,你首先必须在一个*.BAS文件中定义注册库函数的原形,这些函数原形必须同存储在ADVAPI32.DLL中的所需要的注册库APIs相兼容。你还需要添加那些对调用这些APIs所需要的结构和常量的声明。这些对函数原形,结构以及常量的声明全部包含在VBREG.BAS文件中,该文件是VBREG,本文的配套样例代码的一部份。要在任何32位的VB工程中使用这些注册库APIs,只需要简单地将VBREG.BAS文件包含在工程中。

  注意:如果你决定在VBREG.BAS文件中添加额外的APIs,结构或常量,在对它们进行声明的时候需要格外小心(特别是这些函数的参数)。要想这些在你的Visual Basic代码中被调用的APIs按照你所预想的工作,正确声明这些函数的参数是异常重要的。许多这类声明的例子可以在WIN32API.TXT文件中找到,该文件作为Visual Basic系统的一部份同时被安装,但是你可能需要对这些声明进行修改,以便使它们能够正常工作。你还可以在WINNT.H文件中找到额外的一些有用的注册库常量,在WINERROR.H文件中找到额外的一些有用的错误常量,这些文件随着Visual C++一起被安装。

  一旦你将一个文件,例如VBREG.BAS包括在你的工程中,你就可以在你的VB代码中调用这些注册库APIs。要记住的是你所转递的参数必须有效且包含有效的值。另外,当STRING值被返回时,必须为此字符串创建一个空间来容纳它。这些APIs,结构以及常量在VBREG样例应用程序中都有说明。

  Windows注册表通过四个主要注册关键字来组织:HKEY_CLASSES_ROOT,HKEY_CURRENT_USER,HEKY_LOCAL_MACHINE,以及HKEY_USERS。在本文中假设你对于这些关键字已经非常熟悉,已经知道如何使用子关键字,以及已经了解在注册库中所包含的值的类型。子关键字可以用“HighestSubkey\NextLevelSubkey\LowerLevelSubkey\”(不包括引号)的形式来表示。其中“HighestSubkey”是最高级的子关键字,它直接位于四个主关键字之下。

  注册关键字可以被创建,删除,打开,关闭。正如你可能所想到的,一个注册关键字在能够使用之前需要首先创建它,在对一个注册关键字进行修改之前必须要首先打开它。在应用程序执行期间,你应该关闭所有的当前未被使用的关键字,并且你应该仅仅只删除那些你能确定将来绝对不会再使用的关键字。

  注册值可以被创建,查询,修改以及删除。一个值在它能够被查?之前必须已经被创建或是修改(通过使用RegSetValueEx来完成)。同注册关键字一样,如果你想删除它,你需要确定它将来绝对不会再被使用。

  另外,注册关键字和值可以被枚举,以助你决定当前的那些输入是可以使用的。如果你在编译期间不能够确定对哪些关键字或值感兴趣,枚举功能就非常有用了。

  有一点很有趣的注意事项是RegDeleteKeyAPI在没有子关键字的情况下将只删除注册关键字。由于这个原因,VBREG不允许删除一个带有子关键字的关键字。不过你能够很容易的添加删除关键字以及子关键字的功能,你只需要创建一个过程,该过程枚举你需要操作的关键字下的所有子关键字(以及这些子关键字的子关键字),并且在删除该关键字之前首先删除所有的子关键字。对于每个子关键字都应该在RegDeleteKey函数中检查ERROR_ACCESS_DENIED标志,这样的有效的递归进程能工作得很好。

  VBREG使用HKEY_LOCAL_MACHINE,在如下的VBREGForm_Load()过程中被设置:hKey = HKEY_LOCAL_MACHINE
  通过将此变量设置为其它的四个主注册关键字之一,你能够很容易的使用它们。更进一步,你能够从用户或是一个已知的注册库位置获取这些信息。

  使用这些注册表APIs,一个比较好的方法是检查函数所返回的值以确定函数的调用是否成功(如果函数调用成功,它将会返回ERROR_SUCCESS标志)。如果不成功,你还可以检查错误值,基于错误发生的类型,你可以决定你的应用程序接下来该怎么做。还有一个比较好的方法是使用注册表APIs(例如在VBREG样例中的CreateRegKey函数)来为错误设置陷井,以决定你的应用程序在错误发生后的行为。

  VBREG创建和修改的值都是REG_SZ类型(Unicode空结束字符串)的值。这里还有几种其它类型的值可以在注册库中使用,例如REG_BINARY,REG_LINK,以及REG_DWORD。例如,要写一个REG_DWORD类型来替换REG_SZ类型,则SetRegValue过程的RegSetValueEx调用应该被改为:
lResult=RegSetValueEx(phkResult,sSetValue,0,REG_DWORD,CInt(sValue),4&)
  这里假设该“sValue”包含一个可以被转化为一个整数的值。你可能会需要在代码中进行更深入的修改以使用这些其它类型的值。

  在你能够使用一个注册库关键字之前,该关键字必须被创建。RegCreateKeyExAPI提供了运行时刻的这个功能。如果关键字不存在,则RegCreateKeyEx将创建一个新的关键字,而如果关键字已经存在,则将只简单地将它打开。下面是在VBREG的CreateRegKey过程中对RegCreateKeyEx的调用。

CreateRegKey=(RegCreateKeyEx(hKey,SubKey&NewSubKey,0,"",_REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,_SA,phkResult,Create)=ERROR_SUCCESS)

  如果RegCreateKeyEx函数返回了ERROR_SUCCESS标志,则你可以为REG_CREATED_NEW_KEY或REG_OPENED_EXISTING_KEY检查Create参数,以确定是否有一个新的关键字被创建。在上面的调用中,REG_OPTION_NON_VOLATILE创建一个持久的关键字,KEY_ALL_ACCESS则给予所有的用户对此关键字的完整的访问权利。其它的选项也同样能够被指定。这些选项在VisualC++所带的Windows API参考中有更深入的解释。

  一旦你有需要的注册表关键字,你可以使用RegOpenKey或RegKeyCreateEx来在将来需要的时候打开它们。你可能会注意到在VBREG中在看上去应该使用RegOpenKey的地方使用了RegKeyCreateEx。我发现如果不使用RegKeyCreateEx来打开此关键字,则有一些操作将会返回ERROR_ACCESS_DENIED标志。这可能会构成额外的开支;如果该关键字不存在的话它将会真正地创建此关键字。如果这不是你所需要的,你应该试着在调用RegCreateKeyEx之前首先调用RegOpenKey,然后看看它的调用是否成功。

  一旦一个关键字被打开,你可以使用RegSetValueEx来设置它的值,如果需要的话,你也可以创建它。如果一个值还不存在,而你又不想创建它,你应该在调用RegSetValueEx之前首先调用RegQueryValueEx,然后测试它的返回值是不是ERROR_SUCCESS。下面是在VBREG的SetRegValue过程中对RegSetValueEx的调用:

lResult=RegSetValueEx(phkResult,sSetValue,0,REG_SZ,sValue,_CLng(Len(sValue)+1))

  在上面的调用中,REG_SZ是被写入的值的类型。正如在前面所提到过的,如果你正确转递参数,你也可以写入其它类型的值。
  你还可以通过使用RegQueryValueEx来在注册库中查询一个存在的值。如果此函数调用成功,它将会返回ERROR_SUCCESS标志。下面是VBREG的GetRetValue过程中的代码段:

'Creatthebuffer.
 szBuffer=Space(255)
 lBuffSize=Len(szBuffer)
'Openthekey.
 RegOpenKeyEx(hKey,lpszSubKey,0,1,phkResult)
'Querythevalue
 lResult=RegQueryValueEx(phkResult,szKey,0,0,szBuffer,lBuffSize)

  在这里需要注意的最为重要的事情是要为缓冲创建足够的空间。使用C语言APIs返回一个STRING值作为一个输出(out)参数(例如RegQueryValueEx的第5个参数),你必须显式地为此参数定义一个空间。如果这项操作失败,将会导致产生一个不可预料的结果值。

  这篇文章意图告诉你在VisualBasic4.0应用程序中如何使用Windows注册表APIs。如果你希望看到更多的有关Windows注册表或注册表APIs的信息,请参考Visual C++所带的Windows API参考,以及在Microsoft开发库(Microsoft Development Library)中有关的文字。
在Delphi中实现类似VB中的控件数组。 在RichEdit中的串查找-Delphi资料 在按钮中快速启动程序-Delphi资料 怎样读出MEMO控件的当前值-Delphi资料 怎样使用Delphi 5中的TExcelApplication操纵Excel 97/2000 怎样在TDataset中汉英混用-Delphi资料 制作可移动的窗体的MovePanel控件-Delphi资料 制作可移动的分割窗体-Delphi资料 制作用于日期时间型字段的DELPHI数据感知控件 制作主窗口显示前的版权窗口-Delphi资料 状态条插入可视控件-Delphi资料 做动态显示的控件-Delphi资料 做一个OpenGL控件-Delphi资料 Api函数列表——与打印相关-Delphi资料 Delphi 5快速创建控制面板程序 Delphi 编写Windows NT服务 Delphi 的 分 发 工 具 ─ ─InstallShield Delphi 关于系统编程中的技巧 Delphi3如何调用Excel Delphi5.0中的函数调用模式 用Delphi 编 程 时 如 何 利 用 线 程 Delphi的8个技巧 delphi函数参考手册 DELPHI键盘常用快捷键汇总(DEFAULT 和CLASSIC) Delphi实现自动切换输入法 Delphi使用汇编 Delphi系 统 提 示 信 息 的 汉 化 DELPHI下的多线程程序设计 Delphi下汉字输入法的编程及使用 在Delphi与C++之间实现函数与对象共享 DELPHI中处理时间 各位侠士,vc中怎样读取DBGrid Control中的数据?怎样执行sql 语句?就向delphi中一样?拜托!拜托! 版本控制问题[Fatal Error]Internal Error: L519 如何在Exhcnage server 服务器上安装反病毒软件 apache服务器如何同tomcat4.0 结合起来. 字符串中怎么显示“”,例如要显示字符串-----"“ID”是必选字段"。 求助Applet Servlet CreateOleObject('ADODB.Connection')怎么用? 哪位有AIX下的cc,xlC,make的中文使用说明?我的英语太差,看系统的帮助头都大了。 谁有SHA1算法源代码的,给我一份,我很急,一定给分!有网址的,也给分? ODBC SQL SERVER DRIVER timeout expired错误,不知如何解决 请问那位大侠知道哪有北大出版社出版的WINDOWS程序设计这本书的电子版下载 如何控制session的有效时间? VBA下怎样实现...... 很简单的问题,如果得到OS是什么啊? VB怎样调用Oracle没有包的存贮过程? 哪位能提供AIX下的cc,xlC,make的中文使用说明?我的英语太差,看系统的帮助头都大了! 那位有用网叶通过servlet提交数据的例子,越简单越好 救命啊! ----关于漂浮的工具条的隐藏(按钮失踪了!)。 主题:为何我的机子只能进入DOS平台,无法再进入Windows界面? 请问什么地方有《UNIX环境高级编程》的随书源代码下载,谢谢!! 如果得到OS的类型啊?用什么API函数啊? 请问哪有Linux的源代码下载??? 作者如何获得他自己编写的程序的版权及著作权? SOS!!请高手速指点, 立刻要用到,谢谢!! 报表字段过长如何分行打印? 急。。。关于字体属性 Jbuilder5.0 注册码,那个想要,我这儿有!今天刚搞到! 高手再哪里,网络程序!!!请赐教,高分!!! 如何在vc中静态调用dl中的函数? 循环里的变量为什么读不出? ADO的问题,请指教 用Delphi6导入VB做的ActiveX控件,为何不能生成VCL类?怎末办? 我给你出个谜语,你帮我解答个问题? 关于SQL SERVER的图片问题 读取二进制注册表的问题! 请问编写AWT的面向对象JAVA程序用哪个开发软件比较好? 关于手机铃声图片的下载 为何去不到记录值? 软件包 给点建议,做什么都打不起精神.学习也学习不进去,我看我要完蛋了都22了什么都不会 菜鸟问题:编译报错(WINDOWS.H already included),急! 数据绑定问题 关于组件ProgID的疑惑: RealPlayer的最新版本是什么? 哪里可以下载? 请教调试问题? 急!我的weblogic的控制台怎么不让进行create操作? 好郁悶啊﹐大家幫幫我﹗ jsp中的select VC中如何打包 在文本中输入,在下拉框中动态显示,大家多帮忙! 寻找算法!! 参与有分了!! 比80米少20%的是( )米,( )米的20%是60米 9、1、6、2,怎么才能=24? 硬糖每千克5.1元,软糖每千克8.9元,要混合后的糖价每千克5.4元,硬软两种糖应取怎样的重量比才合适 比60米少20%的是多少米,多少米的20%是60米一个工厂由于采用了新工艺,原本没件产品成本是50元,现在每件产品的成本降低了15%,现在每件产品的成本是多少元 喜欢和爱是什么概念?有什么区别?各自的含义是什么? 一项工程,甲队单独做要18天,乙队单独做要24天,两队合作多少天 两队合作9天,还剩几分之几 比20米少20%的是()米,()米的20%是60米 爱和喜欢有什么区别 含义各是什么 一项工程,甲队做要18天,乙队做要24天.问两队合作9天,还剩全程的几分之几? 为迎接国庆,我市某环保部门欲将一个长2×10³dm,宽4×10²dm,高8×10dm的长方为迎接国庆,我市某环保部门欲将一个长2×103dm,宽4×102dm,高8×10dm的长方个长方体废水池中的满池废水注入正方体 硬糖每千克10.8元,软糖每千克14.8元,把两种糖混合后售价为每千克12.3元.问你知道混合后两种糖的重量比是多少吗? 一个正方体的棱长和是48cm 每条长( )cm 其表面积是( )cm2 BOB的意思是什么? 硬糖每千克10.8元,软糖每千克14.8元,把这两种糖混合后售价为每千克12.3元.混合后两种糖果的,重量比是多少? 一个正方体放在桌上两面靠墙露出来的表面积48cm的平方则它的()条棱长均为()cm 判断下列说法是否正确?(1)胶体都带电(2)土壤保肥作用是因为土壤里许多物质如粘土、腐殖质等常以胶体形式存在(3)血液透析血清纸上电泳利用的是胶体的性质 如果正方体的棱长是a-1,那么正方体的体积是____,表面积是_______ foot的复数形式是什么? 下列关于质量守恒定律的说法中,正确的是A.化学反应前后,反应物的分子总数一定等于生成物的分子总数B.化学反应的实质就是分子之间的重新组合C.参加化学反应的各物质的总质量一定等于 如果把一个正方体的棱长扩大a倍,那么它的表面积扩大()倍,体积扩大()倍 foot的 复数形式是什么 有两袋米,第一袋重量的5分之一相当于第二袋重量的四分之一,写出第一袋米与第二袋米的重量的比,丙求出比值 如果正方体的棱长为a,那么正方体的表面积为__,体积为__, 挑战题:硬糖每千克5.1克,软糖每千克8.9元,现在要求混合后的糖价每千克5.4元, 从风俗习惯,文化背景简述美国的感恩节 刚刚有个人和我说 我爱你+520XN 正方体的棱长扩大a倍,它的棱长总和扩大( )倍,表面积扩大( )倍,体积扩大( )倍? 应用题 1.将一根木料锯成1米长的小段,共用了7分钟,已知锯下一段要用1分钟.你知道这根木材有多长吗?要算式 我爱你,没有什么目的,只是爱你 希望你过得开心快乐!none 我想知道none在这里是什么意思!none 这个单词单独的意思我知道,是没有,无,不存在.那么放在这句话里是什么意思呢? 正方体的棱长是a厘米,他的体积是( ),表面积是( ),底面积是( ),棱长总和是( )? 一根木料,锯6段需要16分钟,如果要锯11段,需要几分钟?一根木料,锯6段需要16分钟,如果要锯11段,需要几分钟?..................................快.................快.................. 写个空间说说,大概意思“以前是我错过拉,希望现在能给我次机会,我要对你说“我爱你” 大概 100字. 金广建筑工程队做一项工程需要15天,平均每天完成这项工程的几分之几?九天完成这项工程的几分之几 应用题:一根长三米的布料每3/7据一段,每据一段距2分钟,锯完这根木料一共用多少分钟? 150cm平方=?平方米 甲袋和乙袋米共重24.6千克,如从甲袋取3.5千克放入乙袋后质量相等,求甲袋原重多少千克?要正确的计算过程 一根10米长的木头,锯成2米的小段,锯下三小段用6分钟,锯完这根木头共用多少分钟?10/2=5,6/(3-1)=3分,5-1=4(次),3*4=12(分),这是天津宝坻给的标准答案,我觉得有问题.应该是6/3=2分,4*2=8分. 到底是“科学计数法”还是“科学记数法”?我需要令人信服的官方解释,不要用民间的定义,比如百度百科以及wiki 硬糖每千克5.1元,软糖每千克8.9元,现要求混合后的糖价为每千克5.4元,求硬、软两种糖应取多少重量比合适 2.5m³;= dm³; = cm³;ps 上面的全是立方,别看错了 什么科学记数法 硬糖每千克5.1元,软糖每千克8.9元,现要求混合后的糖价为每千克5.4元,要求硬、软两种糖应取怎样的重量比才合适? 判断下列说法的正确1 化学变化的实质是旧化学键的断裂和新化学键的形成.2 反应物和生成物所具有的总能量决定了反应放热还是吸热.3 断裂化学键所吸收的能量小于形成化学键所放出的能 把5千克茶叶平均包成8包.每包茶叶多少千克?每千克可以包成多少包?用分数表示 一项工程,甲乙合做6天完成,甲单独做9天完成,甲单独做比二人合做慢几分之几?请分析 化学:下列说法中正确的是A.电离时生成的阳离子有H+的化合物叫做酸B .电离时生成的阴离子有OH-的化合物叫做碱C.含有阳离子和阴离子的化合物都属于盐类D. 能够导电的溶液中阴离子总数和 甲桌上放5包茶叶,乙桌上放4包茶叶.共重440克.如果各取1包对换,两桌上的重量就相等.求茶叶和糖各重多少千克过程和解答 硬糖每千克17.8元,软糖每千克21元,硬糖五千克与软糖()千克混合后,平均每千克售价19元 (化学判断)下列说法正确的是下列说法正确的是 ()A.1mol 氧B.SO^(2-)4的摩尔质量是96gC.3mol 小麦D.标准状况下,1mol O2和 N2 混合气体的体积约为22.4L错的理由...对的理由...解析...谢谢.. 爱和喜欢的定义是什么? 杜南家有一块梯形的菜地,上底是50米,下底是80米,高是40米.如果每平方米收白菜12千克,这块地一共可以收白菜多少千克? 芭比娃娃是美国哪家玩具公司出品 喜欢和爱的含义相同吗? foot与book的复数形式?!?!foot的复数形式是feet 那book的复数形式是books为什么book的的复数形式不是beek呢?(⊙o⊙)? 6-3/4 INCH 等于多少厘米请朋友们具体点.谢谢你们了. 1、1、6、9、怎么得24? foot的复数形式foot的意思为脚的时候复数为feet..那foot的其它意思的复数也为feet吗?附:footKK:[]DJ:[]n.1.脚,足[C]2.(长袜等的)足部[S1]3.步态[U]4.最下部,底部[the S][(+of)]The village is at the foot of the mounta 1000um等于多少inch如题 1 1 6 9 求二十四 foot 的复数形式
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn