如何当前操作系统是不是64位?如何判断当前应用程序是否在Wow64下运行?

首先什么是Wow64?很多朋友一看到64就认为这个方法是判断当前系统是否是64bit的,其实不然。Wow64是Windows-On-Windows64的意思,它是指在64位的操作系统上(不是指64位的CPU)运行32位应用程序的兼容平台。

下面是MSDN中一段IsWow64的应用程序:

BOOL IsWow64()
{ typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); LPFN_ISWOW64PROCESS fnIsWow64Process; BOOL bIsWow64 = FALSE; fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( GetModuleHandle(_T("kernel32")), "IsWow64Process"); if (NULL != fnIsWow64Process) {fnIsWow64Process(GetCurrentProcess(),&bIsWow64); } return bIsWow64;
}

下面的代码用来检测这个程序的结果:

if( IsWow64() == TRUE )
{_tprintf(_T("IsWow64() == TRUE\n"));
}
else
{_tprintf(_T("IsWow64() == FALSE\n"));
}

让我们编译一下这个程序。

我们需要的是64位的操作系统,比如XP64bit,Windows 2008 R2等都是64bit操作系统。

在64位的操作系统上运行的kernel32.dll中,将会实现IsWow64Process方法,而在32位系统中提供的kernel32.dll中则没有提供相关函数的实现。

比较迷惑人的则是bIsWow64,其实仔细看MSDN中的Remark,会发现:

If the application is a 64-bit application running under 64-bit Windows, the Wow64Process parameter is set to FALSE.也就是说64位应用程序跑在64位的操作系统上,bIsWow64的值将是FALSE而不是TRUE。

因此我们需要分别将我们的程序编译成Win32平台和x64平台的,如果你用Visual Studio进行编译,默认安装则只包含32位的编译器/链接器,即便你是在64位操作系统上安装,也是一样的。你需要在VC++节点下勾选x64选项才可以,Itanium则需要在Server平台下安装才可勾选。然后在编译的时候,分别选择Win32和x64进行编译。

编译后,运行,结果如我们分析的一样:

在64位系统上运行Win32编译配置的结果是IsWow64() == TRUE,而x64编译配置的结果是IsWow64() == FALSE。

如果想要知道当前系统是否是64位的,则可以通过下面的方法:

BOOL Is64bitSystem()
{SYSTEM_INFO si;GetNativeSystemInfo(&si);if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||    si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 ){return TRUE;}else{return FALSE;}
}

注意:需要注意是GetNativeSystemInfo  函数从Windows XP 开始才有, 而 IsWow64Process  函数从 Windows XP with SP2 以及 Windows Server 2003 with SP1 开始才有。

IsWow64的真实用途相关推荐

  1. #if 0 ... #endif的真实用途

    在过去都没有去理会#if 的作用,今天突发奇想,开启编译器试一试. 很多人都知道,#if  0  ...   #endfif的作用跟/*...*/的作用是一样的,就是注释,可是注释为什么不用注释符号/ ...

  2. 前端Js框架 UI框架汇总 特性 适用范围 选择

    身为一个资深后端工程师,面对层出不穷的前端框架,总让人眼花缭乱,做一个综合解析贴,从全局着眼,让我们明白各种前端框架的应用范围,为如何选择前端框架,从不同的维度提供一些线索,做为一个长期优化贴,欢迎指 ...

  3. 图解|通用搜索引擎背后的技术点

    1. 写在前面 今天准备和盆友们一起学习下关于通用搜索引擎的一些技术点. 鉴于搜索引擎内容非常多,每一部分都够写好几篇文章的所以本文只是抛砖引玉,深入挖掘还得老铁们亲力亲为. 通过本文你将对通用搜索引 ...

  4. 测试私有方法 重构_通过测试学Go:指针和错误

    点击上方蓝色"Go语言中文网"关注我们,领全套Go资料,每天学习 Go 语言 你可以在这里找到本章的所有代码[1] 我们在上一节中学习了结构体(structs),它可以组合与一个概 ...

  5. 2018几大主流的 UI/JS 前端框架

    2016年开始应该是互联网飞速发展的几年,同时也是Web前端开发非常火爆的一年,Web 前端技术发展速度让人感觉几乎不是继承式的迭代,而是一次次的变革和创造.这一年中有很多热门的前端开发框架,下面源码 ...

  6. php关键词分词搜索 最多匹配的排在最前面_图解 | 通用搜索引擎背后的技术点...

    来源 | 后端技术指南针头图 | 图虫 写在前面 今天准备和盆友们一起学习下关于通用搜索引擎的一些技术点. 鉴于搜索引擎内容非常多,每一部分都够写好几篇文章的所以本文只是抛砖引玉,深入挖掘还得老铁们亲 ...

  7. 《Go语言圣经》学习笔记 第十章 包和工具

    <Go语言圣经>学习笔记 第十章 包和工具 目录 包简介 导入路径 包声明 导入声明 包的匿名导入 包和命名 工具 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. G ...

  8. Web 前端框架分类解读

    Web前端框架可以分为两类: JS的类库框架 JQuery.JS Angular.JS(模型, scope作用域,controller,依赖注入,MVVM):前端MVC Vue.JS(MVVM)*** ...

  9. 企业微信H5_网页jssdk调用 判断当前客户端版本是否支持指定JS接口

    接上一篇:企业微信H5_网页jssdk调用,ticket签名config及示例https://gblfy.blog.csdn.net/article/details/123170569 文章目录 一. ...

最新文章

  1. python中classes和class的区别-Python中的Classes和Metaclasses详解
  2. IO操作Dex文件加密,APK加固项目实战
  3. 《机器学习实战》第5章 随机梯度上升算法
  4. 微信小程序组件间通信(二)
  5. Web服务器超时处理
  6. CRI陆宵吴:夯实底层,音视频技术未来不远
  7. 剑指offer58-||.左旋转字符串
  8. php 如何实现全选,如何用thinkphp框架实现全选,反选,全不选功能?
  9. 使用Excel调用ABAP系统的函数
  10. tcp实时传输kafka数据_tcp怎么传输大数据
  11. LuoguP1131 [ZJOI2007]时态同步
  12. 简单的控制台五子小游戏棋程序(Java)
  13. 全球最大地标识别数据集问世:包含200万张图片和3万处地标
  14. 在线Javascript压缩工具
  15. oracle 客户端连接数_查看oracle数据库允许的最大连接数和当前连接数
  16. Linux常用命令汇总--tree
  17. oracle 数据库 双机,oracle双机热备份方法
  18. springmvc ResponseEntity 下载文件损坏问题解决方法
  19. matlab simulink入门:搭建一个简单的电路
  20. html盒模型中border的写法,CSS盒模型--边框设置:border: 1px solid red(像素 样式 颜色 ),border-bottom:1px dotted #ccc...

热门文章

  1. 阿里云宣布进入 Serverless 容器时代,推出弹性容器实例服务 ECI
  2. 设计模式——外观模式
  3. debian7get源,自动设置get源
  4. 利好不断 分布式光伏迎黄金时代
  5. RQNOJ 83 魔兽世界
  6. 手机webapp meta标签 (全屏)
  7. 团队开发冲刺第二阶段_4
  8. 构造函数调用虚函数先从子类搜索同名函数
  9. iptables使用ipt_connlimit限制连接数
  10. 用 tap/tun 做虚拟机的网卡