.NET Compact Framework下的注冊(cè)表怎么開發(fā),針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。
創(chuàng)新互聯(lián)專注于鹽城網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供鹽城營(yíng)銷型網(wǎng)站建設(shè),鹽城網(wǎng)站制作、鹽城網(wǎng)頁(yè)設(shè)計(jì)、鹽城網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造鹽城網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供鹽城網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
簡(jiǎn)介
講述CF.net下的注冊(cè)表開發(fā)的基本概念,介紹在Windows Mobile和Wince下操作注冊(cè)表的工具,同時(shí)使用C#實(shí)現(xiàn)了一個(gè)注冊(cè)表導(dǎo)出工具。
背景
Wince和Windows桌面系統(tǒng)一樣都是把系統(tǒng)信息,驅(qū)動(dòng)信息,應(yīng)用程序信息等重要存放在注冊(cè)表里面。最近需要實(shí)現(xiàn)3G設(shè)備的自動(dòng)注冊(cè),3G鏈接項(xiàng)的自動(dòng)創(chuàng)建功能。在實(shí)現(xiàn)該功能的過程中發(fā)現(xiàn)設(shè)備注冊(cè)信息和鏈接項(xiàng)信息均保存在注冊(cè)表里面,所以需要實(shí)現(xiàn)導(dǎo)出注冊(cè)表功能,把注冊(cè)前后的注冊(cè)表信息進(jìn)行比較。
什么是注冊(cè)表
注冊(cè)表(Registry)其實(shí)就是一個(gè)層次型的文件數(shù)據(jù)庫(kù),用于保存操作系統(tǒng)信息,驅(qū)動(dòng)信息,應(yīng)用程序信息,用戶信息等等。在注冊(cè)表內(nèi)有兩個(gè)關(guān)鍵項(xiàng),Key和Value,這里我保留英文,因?yàn)榉g成中文是鍵(key)和值(Value)比較容易混淆。所謂Key就是可以包含SubKey和Value的項(xiàng)??梢岳斫鉃橐粋€(gè)容器節(jié)點(diǎn),SubKey和Key在本質(zhì)上是一樣,SubKey可以繼續(xù)包含SubKey和Value。Value就是包含數(shù)據(jù)類型,數(shù)據(jù)值的項(xiàng),也可以理解為葉子節(jié)點(diǎn),Value不能包含其他SubKey和Value。
注冊(cè)表開發(fā)方案
查看和修改注冊(cè)表,推薦使用以下兩個(gè)工具:
Windows CE Remote Registry Editor,可以在VS 2005和VS 2008的菜單下找到??梢赃h(yuǎn)程查看和修改注冊(cè)表,非常方便??墒窃摴ぞ卟恢С謱?dǎo)入導(dǎo)出功能。
PHM Registry Editor
該工具可以安裝在設(shè)備上,在設(shè)備上直接查看和修改注冊(cè)表。PHM Registry Editor同時(shí)支持導(dǎo)入導(dǎo)出功能,可是導(dǎo)入導(dǎo)出是使用私有格式,和MS的不兼容。
注冊(cè)表開發(fā)的現(xiàn)實(shí)
由于上述兩個(gè)工具的局限性,所以我實(shí)現(xiàn)了一個(gè)注冊(cè)表導(dǎo)出功能,和桌面版的Registry Editor導(dǎo)出功能的文件格式兼容。
操作注冊(cè)表類是在CF.net 2.0引入的,CF.net 1.0不支持。使用注冊(cè)表功能,需要引用Microsoft.Win32 namespace。
using Microsoft.Win32;
下面是導(dǎo)出接口,把根下所以key導(dǎo)出到StringBuilder中。
public StringBuilder Export() { StringBuilder sb = new StringBuilder(); Export(sb, Registry.ClassesRoot); Export(sb, Registry.CurrentUser); Export(sb, Registry.LocalMachine); Export(sb, Registry.Users); return sb; }
在Windows Mobile和Wince系統(tǒng)下注冊(cè)表的項(xiàng)比桌面系統(tǒng)少一些,如上圖可見。
下面的代碼是導(dǎo)出具體的一個(gè)key。
public void Export(StringBuilder sb, RegistryKey key) { //log down itself. sb.AppendFormat(CultureInfo.CurrentCulture, "\r\n[{0}]\r\n", key.Name); //log down values string[] s = key.GetValueNames(); Array.Sort(s); //log down "Default" first try { key.GetValue(Default); ExportValue(sb, key, Default); } catch { } foreach(string name in s) { if (!name.Equals(Default)) { ExportValue(sb, key, name); } } //log down subkeys s = key.GetSubKeyNames(); Array.Sort(s); foreach(string subKeyName in s) { Export(sb, key.OpenSubKey(subKeyName)); } }
導(dǎo)出Key是先導(dǎo)出自身,然后導(dǎo)出Value,導(dǎo)出Value時(shí)如果有Default Value的話先導(dǎo)出Default Value,然后導(dǎo)出其他Value。導(dǎo)出Value后再遞歸導(dǎo)出SubKeys。
下面代碼是導(dǎo)出Value。
private void ExportValue(StringBuilder sb, RegistryKey key, string name) { switch (key.GetValueKind(name)) { case RegistryValueKind.DWord: int dword = (int)key.GetValue(name); if (name.Equals(Default)) { sb.AppendFormat(CultureInfo.CurrentCulture, "@=dword:{0:X8}\r\n", dword); } else { sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"=dword:{1:X8}\r\n", name, dword); } break; case RegistryValueKind.String: if (name.Equals(Default)) { sb.AppendFormat(CultureInfo.CurrentCulture, "@=\"{0}\"\r\n", key.GetValue(name)); } else { sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"=\"{1}\"\r\n", name, key.GetValue(name)); } break; case RegistryValueKind.MultiString: string[] values = (string[])key.GetValue(name); if (name.Equals(Default)) { sb.Append("@=multi_sz:"); } else { sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"=multi_sz:", name); } for (int i = 0; i < values.Length; i++) { if (i != 0) { sb.Append(","); } sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"", values[i]); } sb.Append("\r\n"); break; case RegistryValueKind.Binary: byte[] bytes = (byte[])key.GetValue(name); if (name.Equals(Default)) { sb.Append("@=hex:"); } else { sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"=hex:", name); } int j = 0; for (int i = 0; i < bytes.Length; i++) { // Display each byte as two hexadecimal digits. if (i == (bytes.Length - 1)) { sb.AppendFormat(CultureInfo.CurrentCulture, "{0:X2}", bytes[i]); } else { sb.AppendFormat(CultureInfo.CurrentCulture, "{0:X2},", bytes[i]); } ++j; if (j == 25) { j = 0; sb.Append("\\\r\n"); } } sb.Append("\r\n"); break; } }
由于Value有不同的數(shù)據(jù)類型,導(dǎo)出的時(shí)候根據(jù)數(shù)據(jù)類型來導(dǎo)出不同的格式。key.GetValueKind()函數(shù)可以取出Key數(shù)據(jù)類型RegistryValueKind。
下面是運(yùn)行效果。
環(huán)境:Visual Studio 2008 + Windows Mobile 6 professional SDK + .NET Compact Framework 2.0
關(guān)于.NET Compact Framework下的注冊(cè)表怎么開發(fā)問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。