<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > Windows CE下的注冊表簡介

          Windows CE下的注冊表簡介

          作者: 時間:2011-02-25 來源:網(wǎng)絡(luò) 收藏

          與桌面Windows一樣,Windows CE也使用注冊表(Registry)來保存應(yīng)用程序、驅(qū)動程序和用戶的設(shè)定以及其他一些配置信息。Windows CE注冊表也采用樹形結(jié)構(gòu)來管理配置信息,由于Windows CE注冊表的結(jié)構(gòu)和功能與桌面Windows幾乎一樣,在這里就不詳細(xì)介紹了,讀者可以參考其它關(guān)于注冊表的資料。
          Windows CE支持四個根鍵,描述如下:


          鍵名 描述
          HKEY_LOCAL_MACHINE 硬件和驅(qū)動配置數(shù)據(jù)
          HKEY_CURRENT_USER 用戶配置數(shù)據(jù)
          HKEY_CLASSES_ROOT OLE和文件類型匹配配置數(shù)據(jù)
          HKEY_USERS 適用于所有用戶的數(shù)據(jù)


          由于系統(tǒng)的特點,一些設(shè)備是沒有外存的。因此Windows CE的注冊表提供了兩種實現(xiàn)方式:基于RAM的注冊表(RAM-Based Registry)和基于Hive的注冊表(Hive-Based Registry)。我們可以選擇在Windows CE中使用任何一種注冊表,注冊表類型對于用戶和應(yīng)用程序來說是透明的。


          ◎ 基于RAM的注冊表
          正如其名,基于RAM的注冊表把整個注冊表作為一個對象存儲堆存放在系統(tǒng)的內(nèi)存中。這意味著如果對系統(tǒng)進行冷啟動或者系統(tǒng)斷電,對注冊表的所有改動都會丟失。
          如果使用基于RAM的注冊表,對注冊表的讀寫訪問操作會變得非常高效。因此基于RAM的注冊表比較適用于沒有外部存儲,而且有電池保存內(nèi)存數(shù)據(jù)(battery-backed RAM)的設(shè)備。如果有外存且經(jīng)常冷啟動的設(shè)備采用基于RAM的注冊表,則需要在系統(tǒng)斷電的時候?qū)ψ员磉M行保存,等系統(tǒng)再次啟動時對保存的注冊表進行還原。


          Windows CE提供了兩種方法用來斷電保存基于RAM的注冊表:


          1. Windows CE提供了兩個系統(tǒng)API用來保存和還原整個注冊表,它們的原形如下:
          BOOL RegCopyFile(
          LPCWSTR lpszFile // 保存注冊表信息的文件的名字
          );
          BOOL RegRestoreFile(
          LPCWSTR lpszFile // 保存注冊表信息的文件的名字
          );
          如果要保存和恢復(fù)注冊表,我們只需要在系統(tǒng)斷電的時候調(diào)用RegCopyFile函數(shù)將整個注冊表保存為外存上的一個文件。當(dāng)系統(tǒng)重新啟動時,我們再調(diào)用RegRestoreFile函數(shù)將文件全部讀出RAM中,然后再熱啟動系統(tǒng),我們保存得注冊表就可以生效了。值得注意的是這次熱啟動是必須的,因為只有在系統(tǒng)啟動的時候才會去檢測RegRestoreFile放在RAM里的注冊表信息。這種方法的優(yōu)點是完全可以使用應(yīng)用程序來實現(xiàn)基于RAM的注冊表的保存,而且這種方法相對簡單。但是此方法的缺點是需要兩次啟動。因此效率相對比較低。


          2. 第二種方法需要OEM的參與,OEM可以在BSP的OAL層中實現(xiàn)WriteRegistryToOEM和ReadRegistryFromOEM兩個函數(shù),它們的聲明為:
          DWORD ReadRegistryFromOEM(
          DWORD dwFlags, // 參數(shù), REG_READ_BYTES_START表示讀新的注冊表
          LPBYTE lpData, // 指向注冊表數(shù)據(jù)的緩沖區(qū),由OS分配
          DWORD cbData // 緩沖區(qū)的大小
          );
          BOOL WriteRegistryToOEM(
          DWORD dwFlags, // 參數(shù),REG_WRITE_BYTES_START表示寫新的注冊表
          LPBYTE lpData, // 指向注冊表數(shù)據(jù)的緩沖區(qū),由OS分配
          DWORD cbData // 緩沖區(qū)的大小,0表示到達注冊表尾部
          );
          Windows CE會在系統(tǒng)啟動和關(guān)閉的時候調(diào)用這兩個函數(shù)來保存和恢復(fù)注冊表。此種方法雖然可以避免兩次啟動,但是困難的地方是ReadRegistryFromOEM函數(shù)的實現(xiàn)比較困難,因為在系統(tǒng)啟動的時候,塊設(shè)備驅(qū)動和文件系統(tǒng)的驅(qū)動都還沒有加載,因此不能使用CreateFile,ReadFile這樣的文件系統(tǒng)API來實現(xiàn)ReadRegistryFromOEM函數(shù),只能使用一些更底層的操作來實現(xiàn)。

          ◎ 基于Hive的注冊表
          自從Windows CE 4.0之后,Windows CE提供了基于Hive的注冊表。基于Hive的注冊表把注冊表數(shù)據(jù)存放在文件系統(tǒng)的文件上,這種文件被稱作蜂箱Hive。這就意味著不再需要在系統(tǒng)斷電和啟動時進行保存恢復(fù)注冊表操作。
          Hive是注冊表中的一組鍵,子鍵和值。Hive是文件系統(tǒng)上表現(xiàn)為單個文件。Windows CE中有三種Hive。
          類型 文件 描述
          Boot hive ROM中的Boot.hv HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, HKEY_USERS中的所有數(shù)據(jù)。只在啟動時使用。
          System hive 由OEM決定 (通常是System.hv) HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, HKEY_USERS中的所有數(shù)據(jù)。包含設(shè)備范圍內(nèi)不隨著用戶改變而改變的數(shù)據(jù)。
          User hive User.hv HKEY_CURRENT_USER下的所有數(shù)據(jù)。 包含用戶特有的設(shè)置,每個用戶都有一個單獨的User.hv。
          基于Hive的注冊表適用于對于有永久存儲并且需要經(jīng)常冷啟動的設(shè)備。我們也可以看到,基于Hive的注冊表把系統(tǒng)數(shù)據(jù)和用戶數(shù)據(jù)分開存放,這就意味著基于Hive的注冊表還提供多用戶支持。對于每一個用戶,可以提供不同的User.hv,當(dāng)用戶登錄時加載相應(yīng)的User.hv,從而達到多用戶目的。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();