通常,x86-64 架构提供与 x86 的兼容性。 32 位 Windows(或其他操作系统)可以在 x86-64 处理器上运行。 (如果我错了请纠正我)。
我想知道 32 位 Windows 是否可以(在 C++ 中)知道底层处理器是否是 64 位。例如,如果 Windows 7 32 位运行在 Core i5 上,我们应该能够知道处理器是 64 位(尽管运行的是 Windows 7 32 位)。
您可能会质疑即使处理器是 64 位并且操作系统是 32 位,64 位进程也无法运行的要求(如果我错了,请纠正我)。但程序的目的是了解处理器,而不是操作系统。这个问题 https://stackoverflow.com/questions/9816282/32-bit-operating-system-but-x64-processor可能看起来与此类似,但它没有给出任何 C++ 程序的提示。
这不是 C++ 解决方案,但它似乎可以在 C# 中工作。
但是应该很容易转换为 C++,因为关键点在于 API 结构系统信息 http://msdn.microsoft.com/en-us/library/windows/desktop/ms724958%28v=vs.85%29.aspx和 API获取本机系统信息() http://msdn.microsoft.com/en-us/library/windows/desktop/ms724340%28v=vs.85%29.aspx
首先是获取信息的 API 的引用
[DllImport("kernel32.dll")]
public static extern void GetNativeSystemInfo
([MarshalAs(UnmanagedType.Struct)] ref SYSTEM_INFO lpSystemInfo);
然后是结构 SYSTEM_INFO 和 _PROCESSOR_INFO_UNION
[StructLayout(LayoutKind.Sequential)]
public struct SYSTEM_INFO
{
internal _PROCESSOR_INFO_UNION uProcessorInfo;
public uint dwPageSize;
public IntPtr lpMinimumApplicationAddress;
public IntPtr lpMaximumApplicationAddress;
public IntPtr dwActiveProcessorMask;
public uint dwNumberOfProcessors;
public uint dwProcessorType;
public uint dwAllocationGranularity;
public ushort dwProcessorLevel;
public ushort dwProcessorRevision;
}
[StructLayout(LayoutKind.Explicit)]
public struct _PROCESSOR_INFO_UNION
{
[FieldOffset(0)]
internal uint dwOemId;
[FieldOffset(0)]
internal ushort wProcessorArchitecture;
[FieldOffset(2)]
internal ushort wReserved;
}
现在使用枚举来简化代码和调用本机 API 的方法
public enum ProcessorArchitecture
{
Unknown = 0,
Bit32 = 1,
Bit64 = 2,
Itanium64 = 3
}
static public ProcessorArchitecture ProcessorBits
{
get
{
ProcessorArchitecture pbits = ProcessorArchitecture.Unknown;
SYSTEM_INFO l_System_Info = new SYSTEM_INFO();
GetNativeSystemInfo(ref l_System_Info);
switch (l_System_Info.uProcessorInfo.wProcessorArchitecture)
{
case 9: // PROCESSOR_ARCHITECTURE_AMD64
pbits = ProcessorArchitecture.Bit64;
break;
case 6: // PROCESSOR_ARCHITECTURE_IA64
pbits = ProcessorArchitecture.Itanium64;
break;
case 0: // PROCESSOR_ARCHITECTURE_INTEL
pbits = ProcessorArchitecture.Bit32;
break;
default: // PROCESSOR_ARCHITECTURE_UNKNOWN
pbits = ProcessorArchitecture.Unknown;
break;
}
return pbits;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)