C/C++ 获取Windows系统的位数32位或64位的实现代码

C/C++ 获取Windows系统的位数32位或64位的实现代码

场景

1.在Windows 64bit系统开发程序时, 某些情况需要判断Program Files路径, 但是64bit系统有两个Program Files或 Program Files(x86), 这时候就需要根据当前系统的位数来获取路径了.

说明

1.通过判断程序是32bit或64bit并没有什么用,因为64bit系统可以运行32bit和64bit程序.

2.64bit系统的kernel32.dll 里有一个函数接口 IsWow64Process,只需要判断这个dll是否有这个导出函数即可.

例子

// test-OSBit.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <Windows.h>
#include "Shlobj.h"
#include <iostream>

typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);

static LPFN_ISWOW64PROCESS fnIsWow64Process = NULL;

//
//  FUNCTION: SafeIsWow64Process(HANDLE, PBOOL)
//
//  PURPOSE: This is a wrapper of the IsWow64Process API. It determines
//  whether the specified process is running under WOW64. IsWow64Process
//  does not exist prior to Windows XP with SP2 and Window Server 2003 with
//  SP1. For compatibility with operating systems that do not support
//  IsWow64Process, call GetProcAddress to detect whether IsWow64Process is
/// implemented in Kernel32.dll. If GetProcAddress succeeds, it is safe to
//  call IsWow64Process dynamically. Otherwise, WOW64 is not present.
//
//  PARAMETERS:
//  * hProcess - A handle to the process.
//  * Wow64Process - A pointer to a value that is set to TRUE if the process
//   is running under WOW64. If the process is running under 32-bit Windows,
//   the value is set to FALSE. If the process is a 64-bit application
//   running under 64-bit Windows, the value is also set to FALSE.
//
//  RETURN VALUE: If the function succeeds, the return value is TRUE.If
//  IsWow64Process does not exist in kernel32.dll, or the function fails,
//  the return value is FALSE.
//
static BOOL WINAPI SafeIsWow64Process(HANDLE hProcess, PBOOL Wow64Process)
{
  if (fnIsWow64Process == NULL)
  {
    // IsWow64Process is not available on all supported versions of
    // Windows. Use GetModuleHandle to get a handle to the DLL that
    // contains the function, and GetProcAddress to get a pointer to the
    // function if available.
    HMODULE hModule = GetModuleHandle(L"kernel32.dll");
    if (hModule == NULL)
    {
      return FALSE;
    }

    fnIsWow64Process = reinterpret_cast<LPFN_ISWOW64PROCESS>(
      GetProcAddress(hModule, "IsWow64Process"));
    if (fnIsWow64Process == NULL)
    {
      return FALSE;
    }
  }
  return fnIsWow64Process(hProcess, Wow64Process);
}

//
//  FUNCTION: Is64BitOS()
//
//  PURPOSE: The function determines whether the current operating system is
//  a 64-bit operating system.
//
//  RETURN VALUE: The function returns TRUE if the operating system is
//  64-bit; otherwise, it returns FALSE.
//
static BOOL Is64BitOS()
{
#if defined(_WIN64)
  return TRUE;  // 64-bit programs run only on Win64
#elif defined(_WIN32)
  // 32-bit programs run on both 32-bit and 64-bit Windows
  BOOL f64bitOS = FALSE;
  return (SafeIsWow64Process(GetCurrentProcess(), &f64bitOS) && f64bitOS);
#else
  return FALSE; // 64-bit Windows does not support Win16
#endif
}

int _tmain(int argc, _TCHAR* argv[])
{
  TCHAR folder[MAX_PATH] = {0};
  if(Is64BitOS())
    ::SHGetSpecialFolderPath(NULL,folder,CSIDL_PROGRAM_FILESX86,FALSE);
  else
    ::SHGetSpecialFolderPath(NULL,folder,CSIDL_PROGRAM_FILES,FALSE);
  std::wcout << "32bit Program Files: " << folder << std::endl;
  system("pause");
  return 0;
}

输出:

32bit Program Files: C:\Program Files (x86)

参考

SHGetSpecialFolderPath function

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • c#判断操作系统位数的示例分享

    在.net 4.5中,判断操作系统不用再写方法去判断了,有直接可以利用的属性了哦,如下所示:Environment.Is64BitProcess 属性.NET Framework 4.5 确定当前进程是否为 64 位进程. 当然如果是用的.net 4.5以前的童鞋也不必担心,同样也可以用以下的方法来实现判断系统位数. 复制代码 代码如下: private string Distinguish64or32System(){try{string addressWidth = String.Empty

  • C/C++ 获取Windows系统的位数32位或64位的实现代码

    C/C++ 获取Windows系统的位数32位或64位的实现代码 场景 1.在Windows 64bit系统开发程序时, 某些情况需要判断Program Files路径, 但是64bit系统有两个Program Files或 Program Files(x86), 这时候就需要根据当前系统的位数来获取路径了. 说明 1.通过判断程序是32bit或64bit并没有什么用,因为64bit系统可以运行32bit和64bit程序. 2.64bit系统的kernel32.dll 里有一个函数接口 IsWo

  • PowerShell小技巧之获取Windows系统密码Hash

    当你拿到了系统控制权之后如何才能更长的时间内控制已经拿到这台机器呢?作为白帽子,已经在对手防线上撕开一个口子,如果你需要进一步扩大战果,你首先需要做的就是潜伏下来,收集更多的信息便于你判断,便于有更大的收获.用什么方法才能有尽可能高的权限,同时能更有效的隐藏自己,是留webshell,留后门,种木马还是Rootkit?webshell,哪怕是一句话木马都很容易被管理员清除,放了木马,也容易被有经验的管理员查出,不管是早期自己创建进程,进程被干掉就完了,还是注入进程的木马,或者是以服务自启动的木马

  • Vue.js获取手机系统型号、版本、浏览器类型的示例代码

    1.index.html引入 <script src="http://code.jquery.com/jquery-1.11.1.min.js"> </script> <script src="https://cdn.jsdelivr.net/npm/mobile-detect@1.4.4/mobile-detect.min.js"> </script> 2.直接用 <script> //判断数组中是否包含

  • C#判断DLL文件是32位还是64位的示例代码

    c#判断dll文件是32位还是64位,实例代码如下所示: using System; using System.IO; namespace GetDllVersionDemo { /// <summary> /// https://www.cnblogs.com/LifeDecidesHappiness/p/15711169.html /// C#判断DLL文件是32位还是64位 /// LDH @ 2021-12-20 /// </summary> internal class

  • python获取linux和windows系统指定接口的IP地址的步骤及代码

    实验目的: 用户输入网卡名称,通过函数返回对应的IPv4和IPv6地址. 实验代码: 步骤一: 由于window系统下网卡名称并不是真正的名字,而真正的ID在注册表SYSTEM\CurrentControlSet\Control\Network{4d36e972-e325-11ce-bfc1-08002be10318}目录下.所以需要通过如下代码,返回接口名称和唯一ID的对应关系. win_ifname.py: import netifaces as ni # import winreg as

  • windows7 32、64位下python爬虫框架scrapy环境的搭建方法

    适用于python 2.7 64位安装 一.操作系统:WIN7 64位 二.python版本:2.7 64位(scrapy目前不支持3.x) 不确定位数的,看图 三.安装相关软件(可以从我的百度网盘下载:链接: https://pan.baidu.com/s/1MzHNALJcRePSoaEqBQvGAQ 提取码: xd5e ) 我配置环境的时候是直接pip install scrapy安装的,但是在过程中出现一些错误,发现是由于以下软件安装失败导致的.所以请先安装这4个相关软件再安装scrap

  • PowerShell中获取Windows系统序列号的脚本分享

    windows序列号可以直接在注册表中读取,PowerShell要做的只是读出数据后稍作处理,让它更像一个序列号. 复制代码 代码如下: function Get-ProductKey {        $map="BCDFGHJKMPQRTVWXY2346789"     $value = (get-itemproperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").digitalproductid

  • Oracle客户端版本及位数(Windows系统)查看方法

    一.查看oracle客户端版本:sqlplus -v 二.查看oracle客户端版本是32bit还是64bit 方法一: Step 1:运行sqlplus /nolog命令,如果你服务器安装了多个客户端版本,那么你应该进入对应安装目录的BIN目录后,运行该命令 C:\Users\Mr.Bruce>sqlplus /nolog SQL*Plus: Release 11.2.0.1.0 Production on 星期一 8月 8 16:06:05 2016 Copyright (c) 1982,

  • Windows系统下安装MongoDB与Robomongo环境详解

    前言 先到MongoDB官网下载安装包:https://www.mongodb.com/download-center#community我是win7 64位环境,下载默认的那个即可. 在Robomongo官网下载安装包:https://robomongo.org/download 全都是免费的. 安装mongodb: 根据你的系统下载 32 位或 64 位的 .msi 文件,下载后双击该文件,按操作提示安装即可. 安装过程中,你可以通过点击 "Custom(自定义)" 按钮来设置你的

  • win2003 64位系统下ODBC连接使用方法

    环境 一般系统部署的服务器若是windows系统,就会采用64位win2003的结构.可是我们编写的程序绝大多数都是在x86下32位cpu架构中编译的,要正常移植到64位机器还真的是很麻烦,不仅要求应用程序是64位模式编译,还需要数据库也得是64位,iis64位,framework64位,好在相应的厂商都提供这些支持组件.不知道有人遇到过像我这样的问题么,应用中有需要增加一个Access数据库导入功能,这就需要连接ODBC的mdb驱动,可是Microsoft OLE DB Provider fo

随机推荐