Windows CE下的注冊表簡(jiǎn)介
與桌面Windows一樣,Windows CE也使用注冊表(Registry)來(lái)保存應用程序、驅動(dòng)程序和用戶(hù)的設定以及其他一些配置信息。Windows CE注冊表也采用樹(shù)形結構來(lái)管理配置信息,由于Windows CE注冊表的結構和功能與桌面Windows幾乎一樣,在這里就不詳細介紹了,讀者可以參考其它關(guān)于注冊表的資料。
Windows CE支持四個(gè)根鍵,描述如下:
鍵名 描述
HKEY_LOCAL_MACHINE 硬件和驅動(dòng)配置數據
HKEY_CURRENT_USER 用戶(hù)配置數據
HKEY_CLASSES_ROOT OLE和文件類(lèi)型匹配配置數據
HKEY_USERS 適用于所有用戶(hù)的數據
由于嵌入式系統的特點(diǎn),一些嵌入式設備是沒(méi)有外存的。因此Windows CE的注冊表提供了兩種實(shí)現方式:基于RAM的注冊表(RAM-Based Registry)和基于Hive的注冊表(Hive-Based Registry)。我們可以選擇在Windows CE中使用任何一種注冊表,注冊表類(lèi)型對于用戶(hù)和應用程序來(lái)說(shuō)是透明的。
◎ 基于RAM的注冊表
正如其名,基于RAM的注冊表把整個(gè)注冊表作為一個(gè)對象存儲堆存放在系統的內存中。這意味著(zhù)如果對系統進(jìn)行冷啟動(dòng)或者系統斷電,對注冊表的所有改動(dòng)都會(huì )丟失。
如果使用基于RAM的注冊表,對注冊表的讀寫(xiě)訪(fǎng)問(wèn)操作會(huì )變得非常高效。因此基于RAM的注冊表比較適用于沒(méi)有外部存儲,而且有電池保存內存數據(battery-backed RAM)的設備。如果有外存且經(jīng)常冷啟動(dòng)的設備采用基于RAM的注冊表,則需要在系統斷電的時(shí)候對注冊表進(jìn)行保存,等系統再次啟動(dòng)時(shí)對保存的注冊表進(jìn)行還原。
Windows CE提供了兩種方法用來(lái)斷電保存基于RAM的注冊表:
1. Windows CE提供了兩個(gè)系統API用來(lái)保存和還原整個(gè)注冊表,它們的原形如下:
BOOL RegCopyFile(
LPCWSTR lpszFile // 保存注冊表信息的文件的名字
);
BOOL RegRestoreFile(
LPCWSTR lpszFile // 保存注冊表信息的文件的名字
);
如果要保存和恢復注冊表,我們只需要在系統斷電的時(shí)候調用RegCopyFile函數將整個(gè)注冊表保存為外存上的一個(gè)文件。當系統重新啟動(dòng)時(shí),我們再調用RegRestoreFile函數將文件全部讀出RAM中,然后再熱啟動(dòng)系統,我們保存得注冊表就可以生效了。值得注意的是這次熱啟動(dòng)是必須的,因為只有在系統啟動(dòng)的時(shí)候才會(huì )去檢測RegRestoreFile放在RAM里的注冊表信息。這種方法的優(yōu)點(diǎn)是完全可以使用應用程序來(lái)實(shí)現基于RAM的注冊表的保存,而且這種方法相對簡(jiǎn)單。但是此方法的缺點(diǎn)是需要兩次啟動(dòng)。因此效率相對比較低。
2. 第二種方法需要OEM的參與,OEM可以在BSP的OAL層中實(shí)現WriteRegistryToOEM和ReadRegistryFromOEM兩個(gè)函數,它們的聲明為:
DWORD ReadRegistryFromOEM(
DWORD dwFlags, // 參數, REG_READ_BYTES_START表示讀新的注冊表
LPBYTE lpData, // 指向注冊表數據的緩沖區,由OS分配
DWORD cbData // 緩沖區的大小
);
BOOL WriteRegistryToOEM(
DWORD dwFlags, // 參數,REG_WRITE_BYTES_START表示寫(xiě)新的注冊表
LPBYTE lpData, // 指向注冊表數據的緩沖區,由OS分配
DWORD cbData // 緩沖區的大小,0表示到達注冊表尾部
);
Windows CE會(huì )在系統啟動(dòng)和關(guān)閉的時(shí)候調用這兩個(gè)函數來(lái)保存和恢復注冊表。此種方法雖然可以避免兩次啟動(dòng),但是困難的地方是ReadRegistryFromOEM函數的實(shí)現比較困難,因為在系統啟動(dòng)的時(shí)候,塊設備驅動(dòng)和文件系統的驅動(dòng)都還沒(méi)有加載,因此不能使用CreateFile,ReadFile這樣的文件系統API來(lái)實(shí)現ReadRegistryFromOEM函數,只能使用一些更底層的操作來(lái)實(shí)現。
◎ 基于Hive的注冊表
自從Windows CE 4.0之后,Windows CE提供了基于Hive的注冊表?;贖ive的注冊表把注冊表數據存放在文件系統的文件上,這種文件被稱(chēng)作蜂箱Hive。這就意味著(zhù)不再需要在系統斷電和啟動(dòng)時(shí)進(jìn)行保存恢復注冊表操作。
Hive是注冊表中的一組鍵,子鍵和值。Hive是文件系統上表現為單個(gè)文件。Windows CE中有三種Hive。
類(lèi)型 文件 描述
Boot hive ROM中的Boot.hv HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, HKEY_USERS中的所有數據。只在啟動(dòng)時(shí)使用。
System hive 由OEM決定 (通常是System.hv) HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, HKEY_USERS中的所有數據。包含設備范圍內不隨著(zhù)用戶(hù)改變而改變的數據。
User hive User.hv HKEY_CURRENT_USER下的所有數據。 包含用戶(hù)特有的設置,每個(gè)用戶(hù)都有一個(gè)單獨的User.hv。
基于Hive的注冊表適用于對于有永久存儲并且需要經(jīng)常冷啟動(dòng)的設備。我們也可以看到,基于Hive的注冊表把系統數據和用戶(hù)數據分開(kāi)存放,這就意味著(zhù)基于Hive的注冊表還提供多用戶(hù)支持。對于每一個(gè)用戶(hù),可以提供不同的User.hv,當用戶(hù)登錄時(shí)加載相應的User.hv,從而達到多用戶(hù)目的。
評論