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

读取和修改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)中有关的文字。
当前系统目录-VB资料 得到磁盘上剩余空间的值-VB资料 调用“添加打印机”对话框 -VB资料 调整分辩率和取当前分辩率 -VB资料 定义全局热键-VB资料 动记录应用软件工作时间-VB资料 动态改变屏幕设置-VB资料 读取档案的建立时间及存取时间 -VB资料 多个参数的属性 -VB资料 发现剪帖板的秘密 -VB资料 发现拖(Drap)过来的信息 -VB资料 防止打开同个VB应用多个实例 分割图像的原理 -VB资料 封面的设计 -VB资料 改变 Win95 的 Shell -VB资料 改变墙纸 -VB资料 格式化磁盘 -VB资料 跟我学用ActiveBar-VB资料 VB获得IE的版本号 VB获得Windows启动方式 VB获得打印机驱动程序的设定 VB获得当前计算机上的区域设置 VB获得当前用户名 VB获得分区信息并判断是否有CD VB获得某个文件夹下的所有子目录 VB获得驱动器的卷标 VB获得系统中的所有字体列表 VB获得系统中鼠标的键数 获取驱动器信息-VB资料 文章主题: 获取桌面图象 -VB资料 计算两个日期间的工作日-VB资料 如何用修改组册表来提高WIN98的安全性?不用其他工具 CString 能存放的字符串最长是多少字节? 我想在[root@localhost /root]#提示符下面键入./my.sh就能进入/home/www/download/目录 hook的问题 server2000恢复时,遇到了一个问题 要怎样才能得分啊? Delphi修改注册表 怎么样重画面版 在VB里调用API打开HTML文件 如何使程序运行时隐藏dialog窗口? 关于datawindow脚本内容! AtlReportError问题 Oracle8i Release 8.1.5 原版电子文档(pdf)--- 谁要!!!!! 如何用delphi实现图像网络传输与存储?请高手介绍方法,包括用什么库,通过TCP/IP怎么办? 请教打印问题 一个菜鸟的提问 在BEAN中,System.out.println("yyy")为什么不能输出呀? 局域网接ADSL,如何限制用户上互联网? 如何不安装oracle的客户端用来连接服务器上的oracle数据库 请问哪有VC关于ADO编程的书籍下载? 关于组件的问题? 用DAO连接数据库,在我的机器上运行没问题,但在其它机器上一运行就挂 谁能告我liulee的个人网页地址呀?? 关于在浏览器中直接运行VB程序的问题 十万火急,我遇上两个奇怪的问题。答者重谢。 请问:如何使用toString? 各位,期待已久的简单任务来了!又是100分!(SQL Server 2000) 好累啊,想放弃了,但又无法回头! Java中,Inner class可不可以使用final修饰符? 谁能告我liulee的个人网页地址呀??急 请教如何在程序运行时修改dbgrid控件options属性中的关于多选控制和整行选择的两个属性? 请推荐UNIX方面的书籍 如何使用toString()方法,谢谢 菜鸟系列:一个简单的编译错误,但我不明白!救命啊!!!! 这就是标准?SJ/T11234 SJ/T11235培训纪实 在哪里看我现在linux系统中用的应用软件的版本号?比如wu-ftp sendmail等等! 操作系统版本不同问题 BCB下怎么调用WINDOWS API函数,急 cpu风扇不转的问题…… 游戏开发的高手或者3维建模的高手,是怎样开发人物模型的呢? 今天下午有没有去微软发布会的????马上回答 关于字体问题!请教会者不难者!!!!!!!! 請問怎麼定義小一點得符點數???? ReadFile超时返回什么? 我的机器装了2000server,2000profession 和NT4.0,现在机器空间不够想把nt4.0和2000profession 卸载,请问应该如何进行?? 怎样用PB代码实现在MDI窗口里的 Ctrl + Tab 的功能 ? 如何将静态库加入项目中,有头文件,SETING出也加入,为何说和系统的库重复定义 如何调用非mfc的程序调用mfc下开发的动态连接库, 请问谁有监测图片变化的部分代码?(在线等待) GetCurrentDirectory()?? 用ADo更新图片(bmp,jpg)难道只能将原来的数据记录删除后在添加吗?不能直接更新吗? 碱石灰是用来干什么的? 酸性溶液与中性溶液中水的电离度比较A.>B.=C. 有一根在空气中放置一段时间的镁条样品,其质量为2.56g,将该样品投入到50g足量稀盐酸中,充分反应后称得混合物的质量为52.38g.(1)样品中未被氧化的没镁的质量是多少(2)该镁条未被氧化 关于压力那的图钉简短的面积是0.2mm²,钉帽的面积是0.75cm²,在向墙里按图钉时,手对帽的压强是6×10四次方Pa,问:(1)手对钉帽的压力是多少?(2)钉尖对墙的压力是多少? 长时间暴露在空气中的澄清石灰水是不是溶液Rt我觉得应该还是得把...不确定.问问.. 镁条在空气中易被氧化,有一根在空气中放置一段时间的镁条样品,其质量为2.56g,将该样品投入到50g稀盐酸中,充分反应后称得混合物的质量为52.38g(1)样品中未被氧化的镁的质量是多少?(2) 一艘船从长江驶入大海浮力改变吗?我认为改变,可老师和我说说浮力不变.我想知道为什么?浮力大小不是和液体的密度,还有浸在液体中的深度有关吗.液体密度变大了,浮力不也变大了吗?那位 盛放石灰水的细口瓶由于长期暴露在空气中 溶液的pH逐渐变——石灰水由澄清变——.用——处理盛放石灰水的细口瓶能把瓶子刷干净 镁条在空气中易被氧化,有一根在空气中放置一段时间的镁条样品,其质量为2.56g,将该样品投入到50g稀盐酸中,充分反应后称得混合物的质量为52.38g(1)样品中未被氧化的镁的质量是多少?(2) 空间几何在现实生活中的应用 澄清石灰水露置在空气中一段时间,表面常有一层白膜,说明什么,理由是什么这题的题目是下列事实中,你能得出哪些有关空气组成的结论?并说明理由 石灰水露置在空气中一段时间后,液面会形成一层白色薄膜,薄膜是什么? (1)混合溶液PH=8的原因是(用离子方程式)_________ (2)混合溶液中水的氢离子的密度______0.1摩尔每升...(1)混合溶液PH=8的原因是(用离子方程式)_________ (2)混合溶液中水的氢离子的密度______0.1摩尔每 澄清石灰水长期放置在空气中会有一层白色固体薄膜,说明空气中含有什么 向氢氧化钠和硝酸钡的混合溶液中,逐滴滴入稀硫酸会发生什么现象 一升PH为一的水溶液所含氢离子是多少摩尔? 取一个大口袋盖的瓶子,在其中加一些冰块,将瓶口及时盖好,瓶子内外会发生什么情况,瓶内的水是由什么变成的 在酸性溶液中,水的电离程度比中性溶液中水的电离程度( ) 是大还是小 ph值计算,请问1摩尔和10摩尔的氢离子的PH值是多少? 已知A的5次方=m的5次方n的10次方,求A 网上最近老提的正能量是什么?那里有什么介绍的吗 场强中 1V/m=1N/C 是怎样得到的 石灰水长期漏置在空气中,瓶壁和石灰水底部均会出现白色固体物质,说明空那个其中含有是水蒸气吗 什么时候的空气最清晰 证明:1v/m=1N/C 石灰水长期露置在空气中会出现白色固体物质,说明空间中含有 人们将空气称为什么 谁能解释下为什么 1V = 1J/1C或者告诉我1V的定义是什么 看不懂 1J/1C 功/电荷量? 将稀硫酸,氢氧化钠,硝酸钡在烧杯中混合最后四个空 关于称空气重量的实验为什么充气的一端会下沉?考虑空气浮力的话,充气后气球受到的浮力也会变大啊 1v*1A*t=1j对吗 3.如图1所示,乒乓球从水面下上浮到漂浮在水面上,下列判断正确的是( )A.露出水面前,浮力逐渐增大;露出水我认为因为水具有惯性所以球露出水面后还继续上升再回到漂浮水面的状态所以浮 一天中空气最好的时候是什么时候1.早晨 2.中午 3.晚上 碱石灰可以吸水吗? 一 在做托拆实验的时候,如果我将一条一分米长的试管里装满水插入水槽里 .这时候为什么大气压不将水往上压,直把试管压爆呢 外面的大气压比水下面的压强大啊,二 到底湿摩擦大还是干摩 当光线从空气斜射向水面时,反射光线和折射光线夹角将___ 碱石灰为什么可以吸水 小明将氢氧化钠溶液与硝酸钡溶液混合,发现无明显现象.一段时间后,他再次取敞口放置的上述两种溶液进行混合,结果出现了白色沉淀,请解释可能的原因. 光从空气中进入水中折射的角度有没有规律啊?一束光从空气进入水中两个角度有没有关系?∠1与∠2的关系!如图 碱石灰吸水现象 一个木头的质量是500克,漂浮于水面.(1)木头受到的浮力(2)木头侵入水的体积. 人体从外界吸入的氧与体内产生的二氧化碳在什么处进行交换 碱石灰中什么吸水呢 水开的时候壶嘴会冒出白气,因为水蒸气是看不见得,所以这些白气不是水蒸气,是壶内的水蒸气遇到外面相对冷的空气液化成小水珠,所以这些白气是小水珠.(这样理解对吧?)为什么离壶嘴越 正能量是什么 一艘轮船从江河驶入大海后,受到的浮力如何变化?排开水的体积如何变化? 甲组中有硫酸铜溶液,稀盐酸,CO2.乙组中有锌粉,氢氧化钠溶液,硝酸钡溶液甲组中能与乙组中三中物质都反应的是.乙组中能与甲组中三种物质都反应的是. 有谁知道正能量是一本什么样的书?谁写的? 轮船从河流驶入大海,船的浮力(),船在水中的体积().船排开水的体积() 一块密度比水小的木板,放在水面上,其漂浮的形态是什么样的?那块木板如果有长宽高,木板一定倒伏在水面上吗?有可能竖直在水中吗?什么时候?为什么? 光会在真空折射吗 船从海洋到河流,船排出的液体的体积相同吗?G排相同吗?船收到的浮力相同吗?收到的重力相同吗?急!详细点,烁为什么? 向氢氧化钾和硝酸钡溶液的混合溶液中,逐滴滴加稀硫酸,稀硫酸先和谁反应?为什么? 光从大气层到真空会折射吗问这并不是普通科学题 石灰水长期露制在水中,瓶壁和石灰水底部均会出现白色固体物质 说明空气中含有什么物质? NH3'H2O ,H2O ,NaCl这三种溶液中水的电离程度相同吗?为什么? 镁条在空气中易被氧化,有一根在空气中放置一段时间的镁条样品,其质量为2.56g,把该样品与足量的稀硫酸...镁条在空气中易被氧化,有一根在空气中放置一段时间的镁条样品,其质量为2.56g,把该 澄清石灰水长期露置于空气中,瓶壁和液面会出现一些白色的固体物质,说明了什么? 氯化钠和醋酸铵的溶液均显中性,为什么水的电离程度不同虽然一个是盐,不能改变水的电离一个是弱酸弱碱盐,会促进水的电离,但是,ph不是都是7吗?那电离出来的H离子不是浓度一样的啊,那不 为什么光折射时,在空气中的角大于其他介质(真空除外)的角?请用初二学生能懂的话回答.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘