注册表项的读取

jbo126 2012-11-26 10:30:07
在此仅以一例来说明问题:
HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\Languages\CodeExpansions\Visual C#子键下有一键值对,
键Path,其值为:
%InstallRoot%\VC#\Snippets\%LCID%\Other\;%InstallRoot%\VC#\Snippets\%LCID%\NetFX30\;%InstallRoot%\VC#\Snippets\%LCID%\Visual C#\;%InstallRoot%\VC#\Snippets\%LCID%\Refactoring\;%MyDocs%\Code Snippets\Visual C#\My Code Snippets\;%InstallRoot%\VC#\Snippets\%LCID%\Test\;C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 3\Visual Studio 2012\Snippets\VC#\%LCID%\ASP.NET MVC 3\;C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Visual Studio 2012\Snippets\VC#\%LCID%\ASP.NET MVC 4\;%InstallRoot%\VC#\Snippets\%LCID%\OfficeDevelopment\

我写程序读出上述值后文本的内容与上面列出来的一样,我的问题是:
怎么样把上面两个百分号之间的InstallRoot,LCID等自动展开,比如InstallRoot,这个应该是Vistual Studio的安装位置,我的安装在D:\Program Files (x86)\Microsoft Visual Studio 11.0,怎么样才能进行这个转换呢,或者说压根就没办法?
...全文
290 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hy1160421 2013-12-22
  • 打赏
  • 举报
回复
引用 5 楼 kongwei521 的回复:
http://www.2cto.com/kf/201007/52156.html http://www.cnblogs.com/tangandfish/archive/2008/09/25/1299099.html 参考
请教:如何通过c#编程将.reg文件导入到注册表,不出现提示,求解!非常感谢。。。
thoughter 2012-11-29
  • 打赏
  • 举报
回复
引用 11 楼 jbo126 的回复:
thoughter说的对,至少InstallRoot不是环境变量,需要从其他的地方读取其他注册项,另外LCID也不是环境变量,但可以通过VSLANG读出
不知lz还有什么问题? [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\SxS\VS7]可以获得installdir 然后替换进去
jbo126 2012-11-27
  • 打赏
  • 举报
回复
先谢谢两位,我不是要改变它的值,我只是想在读取的时候顺便展开它,我先去试下
TonyNIFFFFFFFF 2012-11-27
  • 打赏
  • 举报
回复
C#读取注册表信息 注册表是视窗系统的一个核心的数据库,在这个数据库中存放中与系统相关的各种参数,这些参数直接控制中系统的启动、硬件的驱动程序安装信息以及在视窗系统上运行的各种应用程序的注册信息等。这就意味着,如果注册表因为某些原因受到了破坏,轻者是视窗系统启动过程出现异常,重者就有可能导致整个系统的完全瘫痪。所以正确的认识注册表,及时的备份注册表,对于视窗用户就显得相当重要。   C#就可以十分方便、简洁的开发出操作注册表的程序。单击"开始/运行",在"打开"的后面填入"regedit"。就可以看到注册表的数据结构了。"主键"是有层次结构的。主键的下一级主键称为该主键的"子键"。每一个主键可以对拥有多个子键。右边的这些值就是所谓的键值了。每一个主键或者子键都可以拥有多个键值。注册表是一个庞大的数据库,在其中每一个主键,每一个键值都赋予了不同的功能。   C#如何读取注册表中的主键和键值:在.Net FrameWork SDK Beta 2版中,有一个Microsoft.Win32的名称空间,在此名称空间中提供了二个用于注册表操作的类:Registry类、RegistryKey类。这二个类都是封闭类,不可以继承。这二个类定义了许多关于注册表的方法和属性,通过调用这二个类,在Visual C#中就可以比较轻松的处理关于注册表的各种操作了。   (1).Registry类:此类主要封装了七个公有的静态域,而这些静态域分别代表这视窗注册表中的七个基本的主键,具体如下所示: Registry.ClassesRoot 对应于 HKEY_CLASSES_ROOT主键 Registry.CurrentUser 对应于HKEY_CURRENT_USER主键 Registry.LocalMachine 对应于 HKEY_LOCAL_MACHINE主键 Registry.User 对应于 HKEY_USER主键 Registry.CurrentConfig 对应于HEKY_CURRENT_CONFIG主键 Registry.DynDa 对应于HKEY_DYN_DATA主键 Registry.PerformanceData 对应于HKEY_PERFORMANCE_DATA主键   (2).RegistryKey类:此类中主要封装了对视窗系统注册表的基本操作。在程序设计中,首先通过Registry类找到注册表中的基本主键,然后通过RegistryKey类,来找其下面的子键和处理具体的操作的。 下面通过一个读取注册表信息例子来具体说明这二个来的用法。 程序设计和运行的环境:Windows 2000服务器版,.Net FrameWork SDK Beta 2版。 在运行程序前的一些必要的处理工作。在程序设计时,主要功能是读取已经存在的主键键值,用户可以新建若干个主键和对应的键值。 程序的主要功能是读取指定主键下面的所有子键和子键拥有的键值,并以列表的形式按层次显示出来。程序设计过程中的重要步骤以及应该注意的一些问题: 程序中读取主键、子键和键值所使用到的方法: 程序中为了读取指定主键下面的子键和子键中拥有的键值,主要使用了RegistryKey类中的四个方法:OpenSubKey,GetSubKeyNames,GetValueNames,GetValue。具体的用法和意思如下: OpenSubKey ( string name )方法主要是打开指定的子键。 GetSubKeyNames ( )方法是获得主键下面的所有子键的名称,它的返回值是一个字符串数组。 GetValueNames ( )方法是获得当前子键中的所有的键名称,它的返回值也是一个字符串数组。 以下从‘读’‘写’‘删除’‘判断’四个事例实现对注册表的简单操作 1.读取指定名称的注册表的值 private string GetRegistData(string name) { string registData; RegistryKey hkml = Registry.LocalMachine; RegistryKey software = hkml.OpenSubKey("SOFTWARE",true); RegistryKey aimdir = software.OpenSubKey("XXX",true); registData = aimdir.GetValue(name).ToString(); return registData; } 以上是读取的注册表中HKEY_LOCAL_MACHINE\SOFTWARE目录下的XXX目录中名称为name的注册表值; 2.向注册表中写数据 private void WTRegedit(string name,string tovalue) { RegistryKey hklm = Registry.LocalMachine; RegistryKey software = hklm.OpenSubKey("SOFTWARE",true); RegistryKey aimdir = software.CreateSubKey("XXX"); aimdir.SetValue(name,tovalue); } 以上是在注册表中HKEY_LOCAL_MACHINE\SOFTWARE目录下新建XXX目录并在此目录下创建名称为name值为tovalue的注册表项; 3.删除注册表中指定的注册表项 private void DeleteRegist(string name) { string[] aimnames; RegistryKey hkml = Registry.LocalMachine; RegistryKey software = hkml.OpenSubKey("SOFTWARE",true); RegistryKey aimdir = software.OpenSubKey("XXX",true); aimnames = aimdir.GetSubKeyNames(); foreach(string aimKey in aimnames) { if(aimKey == name) aimdir.DeleteSubKeyTree(name); } } 以上是在注册表中HKEY_LOCAL_MACHINE\SOFTWARE目录下XXX目录中删除名称为name注册表项; 4.判断指定注册表项是否存在 private bool IsRegeditExit(string name) { bool _exit = false; string[] subkeyNames; RegistryKey hkml = Registry.LocalMachine; RegistryKey software = hkml.OpenSubKey("SOFTWARE",true); RegistryKey aimdir = software.OpenSubKey("XXX",true); subkeyNames = aimdir.GetSubKeyNames(); foreach(string keyName in subkeyNames) { if(keyName == name) { _exit = true; return _exit; } } return _exit; } 以上是在注册表中HKEY_LOCAL_MACHINE\SOFTWARE目录下XXX目录中判断名称为name注册表项是否存在,这一方法在删除注册表时已经存在,在新建一注册表项时也应有相应判断。
jbo126 2012-11-27
  • 打赏
  • 举报
回复
thoughter说的对,至少InstallRoot不是环境变量,需要从其他的地方读取其他注册项,另外LCID也不是环境变量,但可以通过VSLANG读出
thoughter 2012-11-27
  • 打赏
  • 举报
回复
InstallRoot应该不是系统变量 应该需要读取vs的其他注册表项才能获得
足球中国 2012-11-27
  • 打赏
  • 举报
回复
System.io.path.getdic就可以直接获取。
宝_爸 2012-11-27
  • 打赏
  • 举报
回复
环境变量,用3楼的方法应该可以。
devmiao 2012-11-26
  • 打赏
  • 举报
回复
其实LCID代表一个本地ID,比如英语是1033,中文是2052等等。
蝶恋花雨 2012-11-26
  • 打赏
  • 举报
回复
http://www.2cto.com/kf/201007/52156.html http://www.cnblogs.com/tangandfish/archive/2008/09/25/1299099.html 参考
蝶恋花雨 2012-11-26
  • 打赏
  • 举报
回复
devmiao 2012-11-26
  • 打赏
  • 举报
回复
这个叫环境变量。用 Environment.GetEnvironmentVariables() 访问。
蝶恋花雨 2012-11-26
  • 打赏
  • 举报
回复
每个path对应着一个名字。可以从这里入手。你是要改变path的值吗?
jbo126 2012-11-26
  • 打赏
  • 举报
回复
有人知道没啊

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧