最近要将自己的程序兼容64位系统,本来以为是个大工程,可是查阅了相关资料后发现这个其实不难。因为,一般的32位程序都可以运行在64位系统(当然是一般情况),这个主要是因为64位系统已经考虑到了这种过渡情况。
首先要知道64系统已经为32位的应用程序准备了运行32位程序的环境,这个环境就是WOW64。
WOW64 是 Windows-32-on-Windows-64 的缩写。它为现有的 32 位应用程序提供了 32 位的模拟,可以使大多数 32 位应用程序在无需修改的情况下运行在 Windows 64 位版本上。它类似于旧的 WOW32 子系统,负责在 Windows 32 位版本下运行 16 位的代码。
下面介绍一点编程中要用到的东西。
1。当然,这里你还必须用到一个就是,如何判断系统是32位系统还是64位系统呢?如果你要用小改变是必须知道现在到底是32,还是64。
IsWow64返回TRUE则是64位系统,否则为32位系统。
code如下:VC测试通过
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;
BOOL IsWow64()
{
BOOL bIsWow64 = FALSE;
fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
if (NULL != fnIsWow64Process)
{
if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
{
// handle error
AfxMessageBox("IsWow64 error!");
}
}
return bIsWow64;
}
2。关于注册表的情况。
如果你去看vista64的注册表会发现在程序的安装,卸载等方面,注册表有很大的改变。但是告诉你个好消息是。你的程序中Wow64下运行。所以其中的改变,你不用理睬,这个WOW64会帮你转换的。当然这个仅限于标准的一些注册表的位置变化,具体还要自己多测试。这个变化主要是由于,vista64里面安装的64位程序跟32位程序在安装位置方面有很大的不同,因为多了个program file(x)。
比如卸载程序列表:
xp 位于如下位置:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall
vista64位于如下位置:
HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Microsoft/Windows/CurrentVersion/Uninstall/
但是你如果在vista下访问如下位置
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall
也是没有问题的。
xp下具体的程序在电脑中的位置位于:
HKEY_LOCAL_MACHINE/SOFTWARE
vista中是位于
HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node
如果你在vista64下面依然访问如下位置,
HKEY_LOCAL_MACHINE/SOFTWARE
你得到的其实就是vista下
HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node
的列表。
这其中其实是WOW进行了转换。
所以,很多这些你是不用担心有问题。当然有些非标准的位置,可能有些变化。但是别担心,这些很少会用到的。
关于WOW64的介绍:
硬件本身具有 32 位兼容性模式,可以处理 IA-32 指令的实际执行,而 WOW 层处理诸如在 32 位和 64 位模式之间切换处理器以及模拟 32 位系统的事务。例如,32 位和 64 位程序具有不同的注册表配置单元。还有一个用于 32 位二进制文件的不同的系统目录。64 位二进制文件仍然使用 System32 目录,因此,当 32 位应用程序安装到系统中时,WOW 层会确保将 32 位二进制文件置于一个新的目录 SysWOW64 中。这是通过如下方式实现的:根据应用程序是否运行在 WOW 下,截获对 API 的调用(如 GetSystemDirectory)并返回适当的目录。相同的问题可能会存在于注册表中。因为 32 位和 64 位的 COM 服务器都可以安装在系统上,并位于相同的类标识符 (CLSID) 下,因此 WOW 层需要将对注册表的调用重定向到适当的 32 位或 64 位配置单元中。WOW 层也会处理注册表中某些区域之间的镜像更改,以便使其更简单地支持 32 位和 64 位代码之间的交互操作。
WOW64 非常重要,因为当不关注性能和可伸缩性的问题时,它使您可以利用大多数现有的 32 位代码。它是两种方法的最佳结合。您可以将您的服务迁移到 64 位,同时将 Microsoft 管理控制台 (MMC) 配置管理单元保留为 32 位。Windows 64 位版本包括 MMC 的 32 位和 64 位的版本。当选择保留管理工具为 32 位时,进程间的通讯可能会遇到某些问题,但是只要接口设计正确,诸如远程过程调用 (RPC) 的协议应该可以在 32 位和 64 位进程之间运行。有关 WOW64 的另外一点需要牢记:它并不是为要求高性能的应用程序而设计的。至少,WOW64 子系统需要将 32 位参数扩展到 64 位,并且需要将 64 位的返回值截断为 32 位。在最糟糕的情况下,WOW64 子系统将需要进行内核调用,涉及到的不仅仅是到内核的转换,还有从处理器的 32 位兼容性模式到其本机 64 位模式的转换。在 WOW64 下运行时,应用程序将无法妥当地进行调整。对于那些您要将其保留为 32 位的应用程序而言,请在 WOW64 下测试它们。如果性能不能满足您的期望,您需要考虑将应用程序迁移到 64 位。
WOW64 是在用户模式下实现的,作为 ntdll.dll 和内核之间的层。WOW64 及其支持的一些 DLL 仅仅是可以加载到 32 位进程中的 64 位的 DLL。对于所有其他情况,进程保持为纯进程。32 位的进程无法加载 64 位的 DLL,反之亦然。
看来上面的你也许就比较清楚了吧。一般程序就不需要什么移植,但是如果牵涉到驱动方面的东西,比如安装驱动等,那么这些是需要移植的。因为驱动是安装到内核来进行运行的,所以32位的驱动是不行的。
转自: http://renjwjx.blog.51cto.com/811549/188882