Win64 注册表重定机制向导致程序运行异常
2008-12-06 15:38
232 查看
前一段时间,软件安装包制作完成,在32位机器上部署、运行正常,但移到服务器上(Win2003 64bit),运行时提示找不到注册表项。
为在Win64中能够运行Win32程序,引入了WoW64(Windows-on-Windows 64-bit)技术。
参考:维基百科WOW64
WoW64技术会对Win32程序的部分文件、注册表进行重定向:
1.文件
Program Files Program Files (x86)
%Systemroot%\System32 %Systemroot%\SysWOW64
2.注册表
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER\Software\Classes
HKEY_LOCAL_MACHINE\Software
HKEY_USERS\*\Software\Classes
HKEY_USERS\*_Classes
32bit程序操作这些注册表项都自动重定向到他的\SysWOW64子项下。
文件和注册表重定向是系统自动维护的。疑问:既然系统自动维护重定向,程序应该正常。
我们的托管程序的编译选项是Any CPU。IL代码并无32bit和64bit之分,在win32下当作32bit程序,win64中当作64bit程序。
安装包是在Win32下做的,安装包负责写注册表,托管程序去读注册表,问题就出在这,Win64把安装包当作32为程序,对其进行的注册表操作进行了重定向,而读的时候却没有进行相应的重定向。
安装包使用wix做的,加上选项,把写注册表这个模块作为64bit程序运行,阻止其重定向即可。
<Component Id='XXX0' Guid='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' Win64='yes'>
<Registry Id ='XXX1' Root='HKLM' Key='SOFTWARE\XXXXXX' Name='XXX' Action='write' Type='string' Value='XXXXXX' />
</Component>
其他解决方法是可以将键值写到一个系统不会进行重定向的项或判断平台,根据平台取相应的键值。
当然,最好是少使用甚至不用注册表,过分依赖注册表违背.NET设计的初衷。
为在Win64中能够运行Win32程序,引入了WoW64(Windows-on-Windows 64-bit)技术。
参考:维基百科WOW64
WoW64技术会对Win32程序的部分文件、注册表进行重定向:
1.文件
Program Files Program Files (x86)
%Systemroot%\System32 %Systemroot%\SysWOW64
2.注册表
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER\Software\Classes
HKEY_LOCAL_MACHINE\Software
HKEY_USERS\*\Software\Classes
HKEY_USERS\*_Classes
32bit程序操作这些注册表项都自动重定向到他的\SysWOW64子项下。
文件和注册表重定向是系统自动维护的。疑问:既然系统自动维护重定向,程序应该正常。
我们的托管程序的编译选项是Any CPU。IL代码并无32bit和64bit之分,在win32下当作32bit程序,win64中当作64bit程序。
安装包是在Win32下做的,安装包负责写注册表,托管程序去读注册表,问题就出在这,Win64把安装包当作32为程序,对其进行的注册表操作进行了重定向,而读的时候却没有进行相应的重定向。
安装包使用wix做的,加上选项,把写注册表这个模块作为64bit程序运行,阻止其重定向即可。
<Component Id='XXX0' Guid='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' Win64='yes'>
<Registry Id ='XXX1' Root='HKLM' Key='SOFTWARE\XXXXXX' Name='XXX' Action='write' Type='string' Value='XXXXXX' />
</Component>
其他解决方法是可以将键值写到一个系统不会进行重定向的项或判断平台,根据平台取相应的键值。
当然,最好是少使用甚至不用注册表,过分依赖注册表违背.NET设计的初衷。
相关文章推荐
- Visual Studio 2008 运行时 提示 外接程序VMDebugger未能加载导致异常
- Android游戏开发19:SurfaceView运行机制剖析--处理切换到后台再重新进入程序时的异常
- 华山之巅,摆平.NET――ASP.NET调试库损坏导致程序运行异常
- 服务器因为其他原因打了系统补丁,导致.net2.0损坏,IIS以及运行.net2.0的程序出现异常
- Android SurfaceView运行机制剖析--处理切换到后台再重新进入程序时的异常
- Java 异常机制,异常的结构,运行时异常和非运行时异常
- VS外接程序VMDebugger未能加载或导致了异常
- 代码没问题一运行就说与偶个问题导致程序停止正常工作了
- MFC中添加Richedit2.0控件导致程序无法运行的解决方法
- Eclipse 中 运行 J2me 程序出现ClassNotFound的异常
- VC程序实现根据文件后缀名查询注册表并用查询结果运行打开程序打开对应文件
- [读书笔记]Windows程序内部运行机制【一】
- 一个range函数理解错误导致程序运行不正确的例子
- Spark运行程序异常信息: org.apache.spark.SparkException: Task not serializable 解决办法
- CString导致程序异常的问题
- 线程内Socket被动关闭导致程序异常问题
- 用注册表禁止运行指定的程序
- jsp中用struts的push标签时 ,程序运行报异常Stream closed 解决方案一
- 孙鑫VC++讲座笔记-(1)Windows程序内部运行机制
- 修改注册表,在运行程序后加一个pause;方便查看一闪而过的程序|打开加加 软件简介