秋梦无痕

一场秋雨无梦痕,春夜清风冻煞人。冬来冷水寒似铁,夏至京北蟑满城。

Avatar

64位电脑下,注册表操作的一些注意事项

from: 蝈蝈俊.net@博客堂

如果64位Window操作系统中,执行32位程序,对注册表进行增加操作.

比如你代码中写的操作是操作
HKEY_LOCAL_MACHINE\SOFTWARE\HongjunGuo\MyDemo
实际他操作的是
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\HongjunGuo\MyDemo

比如:
我们写了这样一个服务程序。其中安装部分代码中包含如下代码:

RegistryKey key1 = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\HongjunGuo\MyDemo");
if (key1 == null) return;
key1.SetValue("ApplicationPath", Directory.GetCurrentDirectory());
key1.Close();

我们执行如下代码进行安装:
"%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe" MyWindowsService.exe

安装后,就会发现上述问题。注册表项不是在你想要得位置。

如果想是你所在的位置,这时候你应该执行
"%SystemRoot%\Microsoft.NET\Framework64\v2.0.50727\InstallUtil.exe" MyWindowsService.exe


来源:
http://www.bitscn.com/windows/advanced/200604/4990.html

在X64系统里面,一些特殊的目录和特殊的注册表键被分为2个独立的部分。对于文件系统来说,%systemroot%\system32 目录被保留给64位文件使用,而32位文件会被重定向到%systemroot%\SysWOW64目录。换句话说,所有的32位程序一般情况下只会出现在%systemroot%\SysWOW64目录里面。任何32位程序试图访问%systemroot%\system32 目录的企图都会被重定向到%systemroot%\SysWOW64目录。这个是一个默认的行为,除非程序的线程明确的指名需要关闭这种重定向机制。

对于注册表来说,也有类似的内容。
注册表重定向,其实质就是维护两套不同的注册表键,一套用于64位,一套用于32位。受影响的键包括:
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER\Software\Classes
HKEY_LOCAL_MACHINE\Software
HKEY_USERS\*\Software\Classes
HKEY_USERS\*_Classes

并不是所有的键值都会受到注册表反射机制的影响。实验证明,如果我们使用32位的注册表编辑器在HKEY_LOCAL_MACHINE\Software下新建一个项,然后使用64位的注册表编辑器查看,会发现这个项只会出现在HKEY_LOCAL_MACHINE\Software\Wow6432Node键下而不会出现在HKEY_LOCAL_MACHINE\Software键下,因为HKEY_LOCAL_MACHINE\Software键是专门用于存放64位程序所使用的注册表数据的,而HKEY_LOCAL_MACHINE\Software\Wow6432Node键是专门用于存放32位程序所使用的注册表数据的。

和linux一样,具有两个不同版本的库

/lib/
/lib64/

编译时候经常找不到库文件,只好到那边去找。。。

评论已关闭