麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

讀取和修改Windows注冊表

2019-11-18 17:52:17
字體:
供稿:網(wǎng)友
使用VisualBasic讀取和修改Windows注冊表

  在過去,VisualBasic應(yīng)用程序的開發(fā)者們對于如何在兩次應(yīng)用程序的運行之間保留狀態(tài)信息感到非常的困難。這是因為基于MicrosoftWindows的應(yīng)用程序(包括VisualBasic)需要將應(yīng)用程序的狀態(tài)信息寫入到一個文本文件(*.INI文件)中,且需要經(jīng)常對這些文件中的文本進行分析,以包含有用的狀態(tài)信息。

  現(xiàn)在,隨著Windows95以及WindowsNT這類32位操作系統(tǒng)的到來,應(yīng)用程序可以通過使用一個叫做Windows注冊表的存儲場所來保留應(yīng)用程序的狀態(tài)信息,并且將它們自己注冊在系統(tǒng)之中。通過位于ADVAPI32.DLL中的C語言應(yīng)用程序編程接口(APIs),對注冊庫的提取和修改變得非常容易。這對于使用C和C 的程序員來說真是太好了,不過對于那些使用其它編程語言,例如VisualBasic的程序員來說,使用這些編程接口還需要進行許多額外的工作。

  作為一個VB程序員,你首先必須在一個*.BAS文件中定義注冊庫函數(shù)的原形,這些函數(shù)原形必須同存儲在ADVAPI32.DLL中的所需要的注冊庫APIs相兼容。你還需要添加那些對調(diào)用這些APIs所需要的結(jié)構(gòu)和常量的聲明。這些對函數(shù)原形,結(jié)構(gòu)以及常量的聲明全部包含在VBREG.BAS文件中,該文件是VBREG,本文的配套樣例代碼的一部份。要在任何32位的VB工程中使用這些注冊庫APIs,只需要簡單地將VBREG.BAS文件包含在工程中。

  注意:如果你決定在VBREG.BAS文件中添加額外的APIs,結(jié)構(gòu)或常量,在對它們進行聲明的時候需要格外小心(特別是這些函數(shù)的參數(shù))。要想這些在你的VisualBasic代碼中被調(diào)用的APIs按照你所預想的工作,正確聲明這些函數(shù)的參數(shù)是異常重要的。許多這類聲明的例子可以在WIN32API.TXT文件中找到,該文件作為VisualBasic系統(tǒng)的一部份同時被安裝,但是你可能需要對這些聲明進行修改,以便使它們能夠正常工作。你還可以在WINNT.H文件中找到額外的一些有用的注冊庫常量,在WINERROR.H文件中找到額外的一些有用的錯誤常量,這些文件隨著VisualC 一起被安裝。

  一旦你將一個文件,例如VBREG.BAS包括在你的工程中,你就可以在你的VB代碼中調(diào)用這些注冊庫APIs。要記住的是你所轉(zhuǎn)遞的參數(shù)必須有效且包含有效的值。另外,當STRING值被返回時,必須為此字符串創(chuàng)建一個空間來容納它。這些APIs,結(jié)構(gòu)以及常量在VBREG樣例應(yīng)用程序中都有說明。

  Windows注冊表通過四個主要注冊關(guān)鍵字來組織:HKEY_CLASSES_ROOT,HKEY_CURRENT_USER,HEKY_LOCAL_MACHINE,以及HKEY_USERS。在本文中假設(shè)你對于這些關(guān)鍵字已經(jīng)非常熟悉,已經(jīng)知道如何使用子關(guān)鍵字,以及已經(jīng)了解在注冊庫中所包含的值的類型。子關(guān)鍵字可以用“HighestSubkey/NextLevelSubkey/LowerLevelSubkey/”(不包括引號)的形式來表示。其中“HighestSubkey”是最高級的子關(guān)鍵字,它直接位于四個主關(guān)鍵字之下。

  注冊關(guān)鍵字可以被創(chuàng)建,刪除,打開,關(guān)閉。正如你可能所想到的,一個注冊關(guān)鍵字在能夠使用之前需要首先創(chuàng)建它,在對一個注冊關(guān)鍵字進行修改之前必須要首先打開它。在應(yīng)用程序執(zhí)行期間,你應(yīng)該關(guān)閉所有的當前未被使用的關(guān)鍵字,并且你應(yīng)該僅僅只刪除那些你能確定將來絕對不會再使用的關(guān)鍵字。

  注冊值可以被創(chuàng)建,查詢,修改以及刪除。一個值在它能夠被查?之前必須已經(jīng)被創(chuàng)建或是修改(通過使用RegSetValueEx來完成)。同注冊關(guān)鍵字一樣,如果你想刪除它,你需要確定它將來絕對不會再被使用。

  另外,注冊關(guān)鍵字和值可以被枚舉,以助你決定當前的那些輸入是可以使用的。如果你在編譯期間不能夠確定對哪些關(guān)鍵字或值感興趣,枚舉功能就非常有用了。

  有一點很有趣的注意事項是RegDeleteKeyAPI在沒有子關(guān)鍵字的情況下將只刪除注冊關(guān)鍵字。由于這個原因,VBREG不允許刪除一個帶有子關(guān)鍵字的關(guān)鍵字。不過你能夠很容易的添加刪除關(guān)鍵字以及子關(guān)鍵字的功能,你只需要創(chuàng)建一個過程,該過程枚舉你需要操作的關(guān)鍵字下的所有子關(guān)鍵字(以及這些子關(guān)鍵字的子關(guān)鍵字),并且在刪除該關(guān)鍵字之前首先刪除所有的子關(guān)鍵字。對于每個子關(guān)鍵字都應(yīng)該在RegDeleteKey函數(shù)中檢查ERROR_access_DENIED標志,這樣的有效的遞歸進程能工作得很好。

  VBREG使用HKEY_LOCAL_MACHINE,在如下的VBREGForm_Load()過程中被設(shè)置:hKey=HKEY_LOCAL_MACHINE
  通過將此變量設(shè)置為其它的四個主注冊關(guān)鍵字之一,你能夠很容易的使用它們。更進一步,你能夠從用戶或是一個已知的注冊庫位置獲取這些信息。

  使用這些注冊表APIs,一個比較好的方法是檢查函數(shù)所返回的值以確定函數(shù)的調(diào)用是否成功(如果函數(shù)調(diào)用成功,它將會返回ERROR_SUCCESS標志)。如果不成功,你還可以檢查錯誤值,基于錯誤發(fā)生的類型,你可以決定你的應(yīng)用程序接下來該怎么做。還有一個比較好的方法是使用注冊表APIs(例如在VBREG樣例中的CreateRegKey函數(shù))來為錯誤設(shè)置陷井,以決定你的應(yīng)用程序在錯誤發(fā)生后的行為。

  VBREG創(chuàng)建和修改的值都是REG_SZ類型(Unicode空結(jié)束字符串)的值。這里還有幾種其它類型的值可以在注冊庫中使用,例如REG_BINARY,REG_LINK,以及REG_DWord。例如,要寫一個REG_DWORD類型來替換REG_SZ類型,則SetRegValue過程的RegSetValueEx調(diào)用應(yīng)該被改為:
lResult=RegSetValueEx(phkResult,sSetValue,0,REG_DWORD,CInt(sValue),4&)
  這里假設(shè)該“sValue”包含一個可以被轉(zhuǎn)化為一個整數(shù)的值。你可能會需要在代碼中進行更深入的修改以使用這些其它類型的值。

  在你能夠使用一個注冊庫關(guān)鍵字之前,該關(guān)鍵字必須被創(chuàng)建。RegCreateKeyExAPI提供了運行時刻的這個功能。如果關(guān)鍵字不存在,則RegCreateKeyEx將創(chuàng)建一個新的關(guān)鍵字,而如果關(guān)鍵字已經(jīng)存在,則將只簡單地將它打開。下面是在VBREG的CreateRegKey過程中對RegCreateKeyEx的調(diào)用。

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

  如果RegCreateKeyEx函數(shù)返回了ERROR_SUCCESS標志,則你可以為REG_CREATED_NEW_KEY或REG_OPENED_EXISTING_KEY檢查Create參數(shù),以確定是否有一個新的關(guān)鍵字被創(chuàng)建。在上面的調(diào)用中,REG_OPTION_NON_VOLATILE創(chuàng)建一個持久的關(guān)鍵字,KEY_ALL_ACCESS則給予所有的用戶對此關(guān)鍵字的完整的訪問權(quán)利。其它的選項也同樣能夠被指定。這些選項在VisualC 所帶的WindowsAPI參考中有更深入的解釋。

  一旦你有需要的注冊表關(guān)鍵字,你可以使用RegOpenKey或RegKeyCreateEx來在將來需要的時候打開它們。你可能會注意到在VBREG中在看上去應(yīng)該使用RegOpenKey的地方使用了RegKeyCreateEx。我發(fā)現(xiàn)如果不使用RegKeyCreateEx來打開此關(guān)鍵字,則有一些操作將會返回ERROR_ACCESS_DENIED標志。這可能會構(gòu)成額外的開支;如果該關(guān)鍵字不存在的話它將會真正地創(chuàng)建此關(guān)鍵字。如果這不是你所需要的,你應(yīng)該試著在調(diào)用RegCreateKeyEx之前首先調(diào)用RegOpenKey,然后看看它的調(diào)用是否成功。

  一旦一個關(guān)鍵字被打開,你可以使用RegSetValueEx來設(shè)置它的值,如果需要的話,你也可以創(chuàng)建它。如果一個值還不存在,而你又不想創(chuàng)建它,你應(yīng)該在調(diào)用RegSetValueEx之前首先調(diào)用RegQueryValueEx,然后測試它的返回值是不是ERROR_SUCCESS。下面是在VBREG的SetRegValue過程中對RegSetValueEx的調(diào)用:

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

  在上面的調(diào)用中,REG_SZ是被寫入的值的類型。正如在前面所提到過的,如果你正確轉(zhuǎn)遞參數(shù),你也可以寫入其它類型的值。
  你還可以通過使用RegQueryValueEx來在注冊庫中查詢一個存在的值。如果此函數(shù)調(diào)用成功,它將會返回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)

  在這里需要注意的最為重要的事情是要為緩沖創(chuàng)建足夠的空間。使用C語言APIs返回一個STRING值作為一個輸出(out)參數(shù)(例如RegQueryValueEx的第5個參數(shù)),你必須顯式地為此參數(shù)定義一個空間。如果這項操作失敗,將會導致產(chǎn)生一個不可預料的結(jié)果值。

  這篇文章意圖告訴你在VisualBasic4.0應(yīng)用程序中如何使用Windows注冊表APIs。如果你希望看到更多的有關(guān)Windows注冊表或注冊表APIs的信息,請參考VisualC 所帶的WindowsAPI參考,以及在Microsoft開發(fā)庫(MicrosoftDevelopmentLibrary)中有關(guān)的文字。->


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 一级做a爱性色毛片免费1 | 亚洲电影在线观看高清免费 | 久久福利小视频 | av电影在线观看网站 | 啪啪激情 | 成人在线视频一区 | 日本看片一区二区三区高清 | 久久久久久久久亚洲精品 | 久久午夜神器 | 久久亚洲网 | 天堂成人一区二区三区 | 国产xxxx岁13xxxxhd | 国产精品剧情一区二区在线观看 | 欧美日韩亚洲成人 | 日本精品免费观看 | 精品一区二区三区中文字幕老牛 | 日韩视频精品一区 | 欧美日韩成人一区二区 | 国产精品久久77777 | 精品国产精品久久 | 欧美特一级片 | 中文欧美日韩 | 黄色av电影在线 | 久久最新免费视频 | 欧美日韩在线视频一区 | 日韩在线播放一区二区 | 九九午夜| 在线成人一区二区 | 特级a欧美做爰片毛片 | 欧美成人精品一区二区男人小说 | 精品中文字幕久久久久四十五十骆 | 中文字幕 亚洲一区 | 久久精品国产久精国产 | 国产精品av久久久久久久久久 | 日韩视频在线一区二区三区 | 久久精品一级片 | 人禽l交免费视频观看 视频 | 一级成人欧美一区在线观看 | 欧美在线观看视频网站 | 成人444kkkk在线观看 | 欧美日韩在线播放 |