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

读取和修改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)中有关的文字。
国外一学生发明新计算机系统,用微芯片代替硬盘 《近匠》第12期:Yeelink——智能硬件云服务 三星Galaxy S5:home键内置指纹识别传感器、5.25寸2K屏幕 Google发布Google Glass使用守则 三星将发布新款智能手表 搭载Tizen系统抛弃Android 从Camera360 V5版本发布,看现代相机应用趋势 索契冬奥会API:赛事的数据直播 为什么开源企业的开源大旗正在褪色 尘埃落定 腾讯确认投资大众点评,获20%股份 Unite China·2014:上千Unity开发者狂欢、五大精品课程全面开启 下载4万首歌曲仅需几秒——蓝色巨人IBM发布新传输技术 15核芯片+数据平台,Intel软硬兼备的Hadoop战略 Facebook以160亿美元收购50名员工、4.5亿月活跃用户的WhatsApp 2014年全美最吃香职业TOP100,程序员排第一 LinkedIn向所有用户开放博客发布平台 Google与Facebook的产品研发之道 小米海外扩张第一步 红米进军新加坡 Google I/O大会时间已定,Google Glass真的来了? 精英团队PK全能型数据科学家,拼的可不只是数量 专攻移动支付?PayPal将面向全球开放移动SDK CoconutKit:iOS开发必备的开源组件库 个人隐私是如何“泄漏”的:国内外互联网企业隐私策略对比 惠普2014年Q1财报:净利润同比增16% PC业务逆势好转 “阅后即焚”挖谷歌墙角,GAE技术大牛跳槽Snapchat 日800万访客、20万RPS网站的5个9可用性架构 程序员想找好工作?那就学好Linux吧! 一周消息树:开源专家袁萌,国产COS操作系统是“杂种”,不是中国软件梦 移动周报:对话智能硬件云服务平台Yeelink Node.app:用Node.js API开发iOS“原生”应用 Google Project Tango:能3D捕捉的智能手机 成功打造Evernote API生态系统的五大经验 推荐一些适合初学者看的书吧 一家位于Montreal, Canada的公司,求购一个程序 如何保存UNICODE的字符串到硬盘上 如何将HTML文本直接显示在CppWebBrowser中?(不使用临时表) 如何保存UNICODE的字符串到硬盘上 redhat第4第5两个iso文件是做什么的 关于jsp做客户端调用ejb的问题?????望各位兄弟们救救我吧!!!!! COOL!将所有菜单设置为半透明的代码(只适用于WIN2000以下版本) 请问谁知道如何用jakarta-jmeter进行压力测试? 如何判断文件夹是否存在 在Win2K Server安装Oracle817时,没有安装数据库,后在创建数据库时出现"ORA-12560:TNS:协议适配器错误"... 请教.net服务器问题 解决这个问题,给你200分!!!!!!!!!!(回头追加给你!) 我是初学者,请问.net framework先进性在哪里? 有谁试过用JAVA编FTP软件? 很简单的listBox问题,HELP 今年大四,现在找工作,求助,我怎么样………UP有分。 寻找!! IE的文本输入框,输入一字符会联想,请问怎样去掉这个联想?(Win2K) 哪位大俠能賜教 哪位大俠能賜教 你们说VC到底要学些什么?VC更偏底层,总做这种纯技术总也做不完。迷茫~~~ 请问,在Oracle里建trigger是不是有什么说法呢?一个正常的不能在正常的trigger在Oracle里运行也说compilation errors. 请教:提取字符串里每个字符首字母,谢谢!!! aa模块代码 关于强烈要求恢复可用分增长、可用分转移、非技术区得分转换为可用分的建议!! SOS:如何找到窗口中多个进程其中我所需要的那一个? SOS:如何找到窗口中多个进程其中我所需要的那一个? 笑的人再发几个 query1.next是将指针移向下一条,啊向上条一记录是用什么命令呢? 对话框中使用工具栏如何进行更新? 关于文件指针的问题 ASP中SELECT 查询中前几条的查询如:TOP 的用法哪位讲解一下. 如何查找到两个不同数窗的不同数据 诚招ASP老师一名(请版主不要删) 提问!(欢迎讨论) 停电重启 原来已经编译通过的程序,再重新编译竟然出现了150个错误 一个很奇怪的想法 请问怎么转换以空格为分割符的文本文件转换为以TAB为分割符的文本文件?急! WIN2000下怎么设CLASSPATH (散分):BDE,ADO,dbExpress的前景如何? 关于VB调用asp的问题 如何关闭office2000文件优化器? 怎么知道combobox选中的序号如combobox.item[i]中的i 怎么知道一张图片的有效宽度及长度 浙大1082的几个疑问 系统快成功了,有个大问题 请问98是不是自带了一个局域网聊天工具? 求助!VC中起动现有的Windows程序的语句。谢谢! 请教:如何在DATAGRID控件的行标头上,写上1,2,3....的顺序号?? 请C++语言高手回答:一个有关C++语言派生的简单问题! 不能用汉字制作电脑系统,为什么不能用汉语注音符号做电脑系统呢?比如VB语言的“input”可以用“ㄕㄨˉㄖㄨˋ”(就是输入的注音符号,拼音‘shū rù’翻译过来就是了) PS和AI实质上的区别是什么.为什么PS那么普遍的使用.AI的使用面很小.他们有什么区别. 遗失的幸福用英语怎么说 续写句子 书是钥匙,能开启智慧之门; 书是良药,__________; 书是_____,__________;在_____ 填 我的书屋,我的梦 .400字作文 我的书屋,我的梦征文怎么写?结合新中国成立65周年 左边一个米右边一个少是什么字 求,写压岁钱的作文 写出歇后语的后半部分.矮子坐高登—()稻草人救火—()炒咸菜放盐巴—()擦胭脂进棺材—()各位...写出歇后语的后半部分.矮子坐高登—()稻草人救火—()炒咸菜放盐巴—() 左边一个米字 右边一个甚字 是什么字 骑马与砍杀和骑马与砍杀战团哪个好玩,有什么不同? 歇后语棺材头上雕花的下一句是什么? This shirt is cheaper ____ that one.填上合适的单词. 毛泽东的座车变迁史的第2题怎么写 18 ST.LEONARDS CL.NOBLE PARK VIC 3174 AUSTRALIA这个英文地址翻译成中文是什么意思 一个者字下面一个羽字读什么一个者字下面一个羽字读什么 英语翻译当你还是很小的时候.妈妈花了很多时间教你用勺子、用筷子,教你怎麼吃饭.教你穿衣服、系鞋带、扣扣子.教你洗脸,梳头发.我爱我的妈妈!你在渐渐长大,而妈妈渐渐的老了有一天 当 有哪个英语单词是9个字母,且第2个是l, 表事拼搏的词 毛泽东的座车变迁史练习题的第1小题怎么写? 请你更换下面各单词中的某个字母,使其成为另一个单词求大神帮助safe 、 meet 、road、hand 快来 急 食盐在20摄氏度,100摄氏度时的为36克,40克.若将100克水在100摄氏度时制成饱和溶液,溶解食盐——克,从中析出食盐固体_克;若降降温后所得溶液保持20克,50克水,则析出食盐的质量分别为_克,_克 《毛泽东的座车变迁史》 1、说说下列词语在文中的意思.横空出世 鲜为人知 y=lg(mx2-mx+1),要使定义域为R,求m 取值范围? 韩国蔚山与美国底特律都是著名的汽车城,它们有何异同? 毛泽东的座车变迁史:“这辆加长型‘大红旗’矫车堪称‘国宝’”.作者为什么要赞叹这辆车堪称“国宝”? 【欢乐女神】表达了作者什么样的精神 世界上纬度最高,跨经度最多大洲和大洋分别是?北冰洋和南极洲共同的特点? 要一篇精彩!的我的书屋我的梦作文,500字以上 欢乐女神蝶的描写片段 七年级上册历史的三次改革都起到了怎样的作用 1、桂林山水美得像() 2、他听到()从那边传来 3、大海里的鱼非常多(改夸张句) 欢乐颂中的欢乐女神是什么含义 左边一个月字旁,右边一个会是什么字? 大海掀起巨浪改成夸张句十万火急啊 大海里的鱼非常多.改夸张句 左边一个女子 右上边一个公下面是一个羽 这个字怎么读啊!急 最长的英文单词是什么求大神帮助 大海里的鱼很多 改成夸张句 英语翻译麻烦翻一下(谢绝翻译器答案 ):"欢迎留下你的脚印"(就是欢迎你留言的意思) 改夸张句:大海里的非常多. 语文人教版四年级上册语文园地七的习作怎么写? 英语翻译1.上课认真听讲2.课后认真完成作业3.考前认真复习4.有恒心,有毅力,敢于钻研5.遇到问题及时询问老师取得好成绩就这么简单! 最长的英文单词是什么?求大神帮助 大海里的鱼非常多.(改为夸张句) 人工智能与智能的定义和本质区别是什么? Sydney Australia是什么意思 Welcome to china when you have free time,I will be your guide for 10 pounds one hour.Is that OK? 英语翻译我所居住的地方是中国冬天最多雪的地方,但今年雪下的特别少.很多国家都拍了以A 为主角的电影 ,但是我觉得J扮演的最形象.我也十分欣赏J.谢绝翻译软件 australia,sydney,amazing什么意思? 海洋里的鱼非常多.(改为夸张)只要写出鱼多就可以了! 检查一下我做的对不对31、I was bad at English last term, I will try my best to learn it _D_____. A. from then on B. from last term C. from on D. from now on 32.—I think that China will win the World Cup one day. —I__A_____. The Chine 60摄氏度时,将30克硝酸钾溶于210克水中,该溶液中溶质的质量分数为---,若将该溶液平均分成三等份,则:(1)取第一份,温度升高到90℃,此时溶液溶质的质量分数为---.(2)取第二份,要使溶液的 Sydney Australia 帮我检查一下我做的对不对-1 I called____you five times yesterday.Where are you?(at)2 It's too late to go to the pictures.Why don't we call the whole thing____?(out)3 We called____to him but he could not hear us.(out)4 I called____the post 上面一个羽字,下面一个佳字.是什么字拼音字母拼 北京和澳大利亚的sydney的四季有什么不同 恐怕像这样的黑色鞋子在两个月前就不流行了.用英文翻译 AI和PS的区别 Sydney.Australia用英语怎样读?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘