windows - 获取Windows体系结构(32/64位版本)

标签 windows architecture kernel32

我遇到了一个小问题:

我想了解操作系统的架构,问题是我的编程语言不支持此类功能。因此我需要从 Windows DLL(如 kernel32.dll)读取此信息
我确实尝试使用函数 GetNativeSystemInfo/GetVersionEx/GetSystemInfo 获取信息。
不幸的是我无法获得架构:/

还有其他一些函数可以读取 Windows dll 中的架构吗?
(不需要是kernel32,可以是任何dll,但必须存在于win xp+中)

作为信息:我使用 Gupta(SQLWindows/Team devoloper)

编辑1:

typedef struct _SYSTEM_INFO {
  union {
    DWORD  dwOemId;
    struct {
      WORD wProcessorArchitecture;
      WORD wReserved;
    } ;
  } ;
  DWORD     dwPageSize;
  LPVOID    lpMinimumApplicationAddress;
  LPVOID    lpMaximumApplicationAddress;
  DWORD_PTR dwActiveProcessorMask;
  DWORD     dwNumberOfProcessors;
  DWORD     dwProcessorType;
  DWORD     dwAllocationGranularity;
  WORD      wProcessorLevel;
  WORD      wProcessorRevision;
} SYSTEM_INFO;

这就是 MSDN 的信息,我尝试使用 10 和 12 个参数调用此函数 (Gupta 不支持结构)。
在 32 位上我得到:
alt text http://img714.imageshack.us/img714/1954/32bit.gif

在 64 位上我得到:
alt text http://img691.imageshack.us/img691/8978/64bit.gif

在 32 位上我每次都会得到 0 OemID 吗?或者更好的是在 64 位版本的 Windows 上填写 OemID everytiem?

谢谢帮助!!

问候
奥罗

最佳答案

GetNativeSystemInfo 肯定是要使用的功能。如果您的应用程序是 native 64 位应用程序,GetNativeSystemInfo GetSystemInfo 相同;否则,如果它在WOW64下运行,它将返回真实的系统属性,即使它是在模拟的32位环境中运行。

GetNativeSystemInfo填写 SYSTEM_INFO 结构,wProcessorArchitecture其中的成员告诉您系统是 32 位(可能是 PROCESSOR_ARCHITECTURE_INTEL )还是 64 位(可能是 PROCESSOR_ARCHITECTURE_AMD64 )。

如果您的语言没有此 Win API 函数的包装器,要使用它,您可以使用 LoadLibraryGetProcAddress像往常一样,您需要定义 SYSTEM_INFO当然是结构。

更新

我会定义

typedef struct _SYSTEM_INFO {
  WORD      wProcessorArchitecture;
  WORD      wReserved;
  DWORD     dwPageSize;
  LPVOID    lpMinimumApplicationAddress;
  LPVOID    lpMaximumApplicationAddress;
  DWORD_PTR dwActiveProcessorMask;
  DWORD     dwNumberOfProcessors;
  DWORD     dwProcessorType;
  DWORD     dwAllocationGranularity;
  WORD      wProcessorLevel;
  WORD      wProcessorRevision;
} SYSTEM_INFO;

然后wProcessorArchitecture = 0在(通用)32 位系统上,以及 wProcessorArchitecture = 9在(通用)64 位系统上。这些只是常数PROCESSOR_ARCHITECTURE_INTELPROCESSOR_ARCHITECTURE_AMD64 , 分别。这些是常见的 32 位和 64 位架构。 PROCESSOR_ARCHITECTURE_IA64 = 6稍微不常见,肯定是 PROCESSOR_ARCHITECTURE_UNKNOWN = 65535 .

更新

是的,我看到你的问题了。在C中,union意味着您一次选择一个选项。也就是说,结构是:

DWORD     dwOemId;
DWORD     dwPageSize;
LPVOID    lpMinimumApplicationAddress;
LPVOID    lpMaximumApplicationAddress;
DWORD_PTR dwActiveProcessorMask;
DWORD     dwNumberOfProcessors;
DWORD     dwProcessorType;
DWORD     dwAllocationGranularity;
WORD      wProcessorLevel;
WORD      wProcessorRevision;

WORD      wProcessorArchitecture;
WORD      wReserved;
DWORD     dwPageSize;
LPVOID    lpMinimumApplicationAddress;
LPVOID    lpMaximumApplicationAddress;
DWORD_PTR dwActiveProcessorMask;
DWORD     dwNumberOfProcessors;
DWORD     dwProcessorType;
DWORD     dwAllocationGranularity;
WORD      wProcessorLevel;
WORD      wProcessorRevision;

由于一个 DWORD 由两个字 (2×2) 一样多的字节 (4) 组成,因此替代方案只是对整个结构的数据进行寻址(和命名)的两种方式。在我们的例子中,我们对 wProcessorArchitecture 更感兴趣单词而不是增强dwOemIdwProcessorArchitecture和完全无趣的wReserved话。

关于windows - 获取Windows体系结构(32/64位版本),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3179916/

相关文章:

windows - 如何将 UTC 日期时间转换为指定时区?

javascript - 在 Web 应用程序中排列和停靠窗口

architecture - 程序经理与软件架构师

c# - 在 Entity Framework 和 C# 中使用两层,一个实体和另一个域的优点和缺点是什么?

基于控制台时间的引擎

c++ - 如何在 Windows 10 上安装 jpeglib

asp.net - Angular + ASP.Net 核心 : Plugin Architecture

c++ - 如何调用 DeviceIoControl 来检索它需要的内存量?

linux - kernel32.dll wine |菜鸟警告|

c++ - Hook kernel32.dll 函数使我的程序无法运行