检查操作系统和处理器是32位还是64位?

4

我希望得到VB6代码来检查操作系统是32位还是64位,以及处理器是32位还是64位。请帮助我获取这些代码。 在VB.NET中,我可以使用Environment.Is64BitOperatingSystem属性来实现,但它只适用于.NET 4.0及以上版本。 但是我该如何在VB6中获取这些信息呢?


尝试使用以下代码获取位数信息:http://www.vb-helper.com/howto_get_os_name.html - JimmyPena
5个回答

3
最简单的回答这两个问题的方法似乎是使用 Win32_Processor WMI类。

操作系统是32位还是64位?

可以通过检查AddressWidth属性来确定操作系统的位数:

AddressWidth

在32位操作系统上,该值为32,在64位操作系统上则为64。

相关的VB6代码如下:

Public Function GetOsBitness() As String
    Dim ProcessorSet As Object
    Dim CPU As Object

    Set ProcessorSet = GetObject("Winmgmts:"). _
        ExecQuery("SELECT * FROM Win32_Processor")
    For Each CPU In ProcessorSet
        GetOsBitness = CStr(CPU.AddressWidth)
    Next
End Function

处理器是32位还是64位?

可以通过检查DataWidth属性来确定处理器的位数:

DataWidth

在32位处理器上,该值为32,在64位处理器上为64。

相关的VB6代码如下:

Public Function GetCpuBitness() As String
    Dim ProcessorSet As Object
    Dim CPU As Object

    Set ProcessorSet = GetObject("Winmgmts:"). _
        ExecQuery("SELECT * FROM Win32_Processor")
    For Each CPU In ProcessorSet
        GetCpuBitness = CStr(CPU.DataWidth)
    Next
End Function

3

对于CPU,您可以使用WMI并获取AddressWidth。

VBScript的示例可以在此处找到。


2
您可以查询Win32_OperatingSystem类的OSArchitecture属性。[MSDN链接](http://msdn.microsoft.com/En-US/library/aa394239.aspx) - Mache
那不正确。如果您在64位处理器上运行32位操作系统,AddressWidth为32。实际上,我认为我的答案是正确的 https://dev59.com/QHDYa4cB1Zd3GeqPAGsu#15860411。 - Ilya Kurnosov

1

操作系统架构

获取操作系统架构的一种方法是使用GetNativeSystemInfo WinAPI函数。这在链接的问题中有涉及。

也可以通过WMI来获取操作系统架构,以便以类似的方式实现两个目标。在Windows Vista和更新的操作系统中,可以查询Win32_OperatingSystem类并分析OSArchitecture属性(MSDN)。遗憾的是,这个属性在Windows XP和早期版本中不存在。在这些系统上,可以查询Win32_ComputerSystem类并分析SystemType属性(MSDN)。

Public Function GetOsArchitecture()
    If IsAtLeastVista Then
        GetOsArchitecture = GetVistaOsArchitecture
    Else
        GetOsArchitecture = GetXpOsArchitecture
    End If
End Function

Private Function IsAtLeastVista() As Boolean
    IsAtLeastVista = GetOsVersion >= "6.0"
End Function

Private Function GetOsVersion() As String
    Dim OperatingSystemSet As Object
    Dim OS As Object

    Set OperatingSystemSet = GetObject("winmgmts:{impersonationLevel=impersonate}"). _
                                    InstancesOf("Win32_OperatingSystem")
    For Each OS In OperatingSystemSet
        GetOsVersion = Left$(Trim$(OS.Version), 3)
    Next
End Function

Private Function GetVistaOsArchitecture() As String
    Dim OperatingSystemSet As Object
    Dim OS As Object

    Set OperatingSystemSet = GetObject("Winmgmts:"). _
        ExecQuery("SELECT * FROM Win32_OperatingSystem")
    For Each OS In OperatingSystemSet
        GetVistaOsArchitecture = Left$(Trim$(OS.OSArchitecture), 2)
    Next
End Function

Private Function GetXpOsArchitecture() As String
    Dim ComputerSystemSet As Object
    Dim Computer As Object
    Dim SystemType As String

    Set ComputerSystemSet = GetObject("Winmgmts:"). _
        ExecQuery("SELECT * FROM Win32_ComputerSystem")
    For Each Computer In ComputerSystemSet
        SystemType = UCase$(Left$(Trim$(Computer.SystemType), 3))
    Next

    GetXpOsArchitecture = IIf(SystemType = "X86", "32", "64")
End Function

地址宽度并不指定进程是32位还是64位,根据http://msdn.microsoft.com/en-us/library/windows/desktop/aa394373(v=vs.85).aspx。相反,在Win32_Processor中,“架构”告诉处理器的体系结构。 - IT researcher
@winman 我做了更多的测试,你是正确的。我从这篇帖子中删除了与 CPU 相关的部分(确实是错误的),并发布了不同的答案:https://dev59.com/QHDYa4cB1Zd3GeqPAGsu#15860411 - Ilya Kurnosov

1
你可以尝试使用Win32_Processor WMI类的DataWidthAddressWidth属性。在32位处理器上,该值为32,在64位处理器上,该值为64。请注意,保留HTML标签。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接