自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

.NET Compact Framework下的注冊表開發(fā)

開發(fā) 后端
本文介紹了.NET Compact Framework下的注冊表開發(fā)。

簡介

本文講述了CF.net下的注冊表開發(fā)的基本概念,介紹在Windows Mobile和Wince下操作注冊表的工具,同時使用C#實現(xiàn)了一個注冊表導(dǎo)出工具。

背景

Wince和Windows桌面系統(tǒng)一樣都是把系統(tǒng)信息,驅(qū)動信息,應(yīng)用程序信息等重要存放在注冊表里面。最近需要實現(xiàn)3G設(shè)備的自動注冊,3G鏈接項的自動創(chuàng)建功能。在實現(xiàn)該功能的過程中發(fā)現(xiàn)設(shè)備注冊信息和鏈接項信息均保存在注冊表里面,所以需要實現(xiàn)導(dǎo)出注冊表功能,把注冊前后的注冊表信息進行比較。

什么是注冊表

注冊表(Registry)其實就是一個層次型的文件數(shù)據(jù)庫,用于保存操作系統(tǒng)信息,驅(qū)動信息,應(yīng)用程序信息,用戶信息等等。在注冊表內(nèi)有兩個關(guān)鍵項,Key和Value,這里我保留英文,因為翻譯成中文是鍵(key)和值(Value)比較容易混淆。所謂Key就是可以包含SubKeyValue的項??梢岳斫鉃橐粋€容器節(jié)點,SubKey和Key在本質(zhì)上是一樣,SubKey可以繼續(xù)包含SubKey和Value。Value就是包含數(shù)據(jù)類型,數(shù)據(jù)值的項,也可以理解為葉子節(jié)點,Value不能包含其他SubKeyValue。

注冊表開發(fā)方案

查看和修改注冊表,推薦使用以下兩個工具:

Windows CE Remote Registry Editor,可以在VS 2005和VS 2008的菜單下找到??梢赃h程查看和修改注冊表,非常方便??墒窃摴ぞ卟恢С謱?dǎo)入導(dǎo)出功能。

Windows CE Remote Registry Editor

PHM Registry Editor

該工具可以安裝在設(shè)備上,在設(shè)備上直接查看和修改注冊表。PHM Registry Editor同時支持導(dǎo)入導(dǎo)出功能,可是導(dǎo)入導(dǎo)出是使用私有格式,和MS的不兼容。

PHM Registry Editor

注冊表開發(fā)的現(xiàn)實

由于上述兩個工具的局限性,所以我實現(xiàn)了一個注冊表導(dǎo)出功能,和桌面版的Registry Editor導(dǎo)出功能的文件格式兼容。

操作注冊表類是在CF.net 2.0引入的,CF.net 1.0不支持。使用注冊表功能,需要引用Microsoft.Win32 namespace。

  1. using Microsoft.Win32;

下面是導(dǎo)出接口,把根下所以key導(dǎo)出到StringBuilder中。

  1. public StringBuilder Export()
  2. {
  3. StringBuilder sb = new StringBuilder();
  4. Export(sb, Registry.ClassesRoot);
  5. Export(sb, Registry.CurrentUser);
  6. Export(sb, Registry.LocalMachine);
  7. Export(sb, Registry.Users);
  8. return sb;
  9. }
 
在Windows Mobile和Wince系統(tǒng)下注冊表的項比桌面系統(tǒng)少一些,如上圖可見。

下面的代碼是導(dǎo)出具體的一個key。

  1. public void Export(StringBuilder sb, RegistryKey key)
  2. {
  3. //log down itself.
  4. sb.AppendFormat(CultureInfo.CurrentCulture, "\r\n[{0}]\r\n", key.Name);
  5. //log down values
  6. string[] s = key.GetValueNames();
  7. Array.Sort(s);
  8. //log down "Default" first
  9. try
  10. {
  11. key.GetValue(Default);
  12. ExportValue(sb, key, Default);
  13. }
  14. catch
  15. {
  16. }
  17. foreach(string name in s)
  18. {
  19. if (!name.Equals(Default))
  20. {
  21. ExportValue(sb, key, name);
  22. }
  23. }
  24. //log down subkeys
  25. s = key.GetSubKeyNames();
  26. Array.Sort(s);
  27. foreach(string subKeyName in s)
  28. {
  29. Export(sb, key.OpenSubKey(subKeyName));
  30. }
  31. }

導(dǎo)出Key是先導(dǎo)出自身,然后導(dǎo)出Value,導(dǎo)出Value時如果有Default Value的話先導(dǎo)出Default Value,然后導(dǎo)出其他Value。導(dǎo)出Value后再遞歸導(dǎo)出SubKeys。

下面代碼是導(dǎo)出Value。

  1. private void ExportValue(StringBuilder sb, RegistryKey key, string name)
  2. {
  3. switch (key.GetValueKind(name))
  4. {
  5. case RegistryValueKind.DWord:
  6. int dword = (int)key.GetValue(name);
  7. if (name.Equals(Default))
  8. {
  9. sb.AppendFormat(CultureInfo.CurrentCulture, "@=dword:{0:X8}\r\n", dword);
  10. }
  11. else
  12. {
  13. sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"=dword:{1:X8}\r\n", name, dword);
  14. }
  15. break;
  16. case RegistryValueKind.String:
  17. if (name.Equals(Default))
  18. {
  19. sb.AppendFormat(CultureInfo.CurrentCulture, "@=\"{0}\"\r\n", key.GetValue(name));
  20. }
  21. else
  22. {
  23. sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"=\"{1}\"\r\n", name, key.GetValue(name));
  24. }
  25. break;
  26. case RegistryValueKind.MultiString:
  27. string[] values = (string[])key.GetValue(name);
  28. if (name.Equals(Default))
  29. {
  30. sb.Append("@=multi_sz:");
  31. }
  32. else
  33. {
  34. sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"=multi_sz:", name);
  35. }
  36. for (int i = 0; i < values.Length; i++)
  37. {
  38. if (i != 0)
  39. {
  40. sb.Append(",");
  41. }
  42. sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"", values[i]);
  43. }
  44. sb.Append("\r\n");
  45. break;
  46. case RegistryValueKind.Binary:
  47. byte[] bytes = (byte[])key.GetValue(name);
  48. if (name.Equals(Default))
  49. {
  50. sb.Append("@=hex:");
  51. }
  52. else
  53. {
  54. sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"=hex:", name);
  55. }
  56. int j = 0;
  57. for (int i = 0; i < bytes.Length; i++)
  58. {
  59. // Display each byte as two hexadecimal digits.
  60. if (i == (bytes.Length - 1))
  61. {
  62. sb.AppendFormat(CultureInfo.CurrentCulture, "{0:X2}", bytes[i]);
  63. }
  64. else
  65. {
  66. sb.AppendFormat(CultureInfo.CurrentCulture, "{0:X2},", bytes[i]);
  67. }
  68. ++j;
  69. if (j == 25)
  70. {
  71. j = 0;
  72. sb.Append("\\\r\n");
  73. }
  74. }
  75. sb.Append("\r\n");
  76. break;
  77. }
  78. }

由于Value有不同的數(shù)據(jù)類型,導(dǎo)出的時候根據(jù)數(shù)據(jù)類型來導(dǎo)出不同的格式。key.GetValueKind()函數(shù)可以取出Key數(shù)據(jù)類型RegistryValueKind

下面是運行效果。

運行效果

環(huán)境:Visual Studio 2008 + Windows Mobile 6 professional SDK + .NET Compact Framework 2.0

【編輯推薦】

  1. 淺談.NET中不一樣的多態(tài)
  2. ASP.NET開發(fā)程序過程中值得注意的兩個地方
  3. 全面總結(jié).NET 4.0新特性:C#和VB.NET的取長補短
  4. 深入理解Java多態(tài)性
  5. ASP.NET的錯誤處理機制
責(zé)任編輯:楊鵬飛 來源: cnblogs
相關(guān)推薦

2011-04-21 09:10:16

2010-01-06 18:47:21

.NET Compac

2009-06-18 10:41:03

RuntimeVers.NET組件

2010-01-11 18:40:03

VB.NET操作注冊表

2009-10-12 16:08:14

VB.NET訪問注冊表

2009-10-16 09:40:54

VB.NET訪問注冊表

2011-09-16 14:22:31

注冊表windowsVist

2011-08-04 16:37:09

注冊表編輯器注冊表

2011-08-03 18:01:40

注冊表

2009-11-10 17:31:38

VB.NET注冊表

2010-01-08 10:09:50

VB.NET注冊表操作

2009-10-26 14:50:18

VB.NET遍歷注冊表

2009-10-26 13:46:31

VB.NET注冊表權(quán)限

2010-01-18 13:57:38

VB.NET讀寫注冊表

2009-08-21 09:43:49

C#編輯注冊表

2011-08-04 16:49:33

注冊表注冊表編輯器

2021-02-18 14:40:38

網(wǎng)絡(luò)安全注冊表代碼

2011-03-17 11:24:15

2011-08-04 11:11:59

2009-10-23 09:36:25

.Net Compac
點贊
收藏

51CTO技術(shù)棧公眾號