hljkwan 发表于 2021-10-25 18:59:34

【已解决】怎么获取内存的品牌和几代

本帖最后由 hljkwan 于 2021-11-9 20:51 编辑

类似就是怎么写代码能完整获取到内存的品牌和DDR几

虫子樱桃 发表于 2021-10-26 14:01:48

;===============================================================================
; Description:      Returns the Memory information in an array.
; Parameter(s):   $aMemoryInfo - By Reference - Memory Information array.
; Requirement(s):   None
; Return Value(s):On Success - Returns array of Memory Information.
;                                                $aMemoryInfo[$i]                = Name
;                                                $aMemoryInfo[$i]                = BankLabel
;                                                $aMemoryInfo[$i]                = Capacity
;                                                $aMemoryInfo[$i]                = CreationClassName
;                                                $aMemoryInfo[$i]                = Description
;                                                $aMemoryInfo[$i]                = DataWidth
;                                                $aMemoryInfo[$i]                = DeviceLocator
;                                                $aMemoryInfo[$i]                = FormFactor
;                                                $aMemoryInfo[$i]                = HotSwappable
;                                                $aMemoryInfo[$i]                = InterleaveDataDepth
;                                                $aMemoryInfo[$i]        = InterleavePosition
;                                                $aMemoryInfo[$i]        = Manufacturer
;                                                $aMemoryInfo[$i]        = MemoryType
;                                                $aMemoryInfo[$i]        = Model
;                                                $aMemoryInfo[$i]        = OtherIdentifyingInfo
;                                                $aMemoryInfo[$i]        = PartNumber
;                                                $aMemoryInfo[$i]        = PositionInRow
;                                                $aMemoryInfo[$i]        = PoweredOn
;                                                $aMemoryInfo[$i]        = Removable
;                                                $aMemoryInfo[$i]        = Replaceable
;                                                $aMemoryInfo[$i]        = SerialNumber
;                                                $aMemoryInfo[$i]        = SKU
;                                                $aMemoryInfo[$i]        = Speed
;                                                $aMemoryInfo[$i]        = Status
;                                                $aMemoryInfo[$i]        = Tag
;                                                $aMemoryInfo[$i]        = TotalWidth
;                                                $aMemoryInfo[$i]        = TypeDetail
;                                                $aMemoryInfo[$i]        = Version
;                   On Failure - @error = 1 and Returns 0
;                                                                @extended = 1 - Array contains no information.
;                                                                                        2 - $colItems isnt an object.
; Author(s):      Jarvis Stubblefield (support "at" vortexrevolutions "dot" com)
; Note(s):
;===============================================================================
Func _ComputerGetMemory(ByRef $aMemoryInfo)
        Local $colItems, $objWMIService, $objItem
        Dim $aMemoryInfo, $i = 1

        $objWMIService = ObjGet("winmgmts:\\" & $cI_Compname & "\root\CIMV2")
        $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_PhysicalMemory", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

        If IsObj($colItems) Then
                For $objItem In $colItems
                        ReDim $aMemoryInfo
                        $aMemoryInfo[$i]                = $objItem.Name
                        $aMemoryInfo[$i]                = $objItem.BankLabel
                        $aMemoryInfo[$i]                = $objItem.Capacity
                        $aMemoryInfo[$i]                = $objItem.CreationClassName
                        $aMemoryInfo[$i]                = $objItem.Description
                        $aMemoryInfo[$i]                = $objItem.DataWidth
                        $aMemoryInfo[$i]                = $objItem.DeviceLocator
                        $aMemoryInfo[$i]                = $objItem.FormFactor
                        $aMemoryInfo[$i]                = $objItem.HotSwappable
                        $aMemoryInfo[$i]                = $objItem.InterleaveDataDepth
                        $aMemoryInfo[$i]        = $objItem.InterleavePosition
                        $aMemoryInfo[$i]        = $objItem.Manufacturer
                        $aMemoryInfo[$i]        = $objItem.MemoryType
                        $aMemoryInfo[$i]        = $objItem.Model
                        $aMemoryInfo[$i]        = $objItem.OtherIdentifyingInfo
                        $aMemoryInfo[$i]        = $objItem.PartNumber
                        $aMemoryInfo[$i]        = $objItem.PositionInRow
                        $aMemoryInfo[$i]        = $objItem.PoweredOn
                        $aMemoryInfo[$i]        = $objItem.Removable
                        $aMemoryInfo[$i]        = $objItem.Replaceable
                        $aMemoryInfo[$i]        = $objItem.SerialNumber
                        $aMemoryInfo[$i]        = $objItem.SKU
                        $aMemoryInfo[$i]        = $objItem.Speed
                        $aMemoryInfo[$i]        = $objItem.Status
                        $aMemoryInfo[$i]        = $objItem.Tag
                        $aMemoryInfo[$i]        = $objItem.TotalWidth
                        $aMemoryInfo[$i]        = $objItem.TypeDetail
                        $aMemoryInfo[$i]        = $objItem.Version
                        $i += 1
                Next
                $aMemoryInfo = UBound($aMemoryInfo) - 1
                If $aMemoryInfo < 1 Then
                        SetError(1, 1, 0)
                EndIf
        Else
                SetError(1, 2, 0)
        EndIf
EndFunc ;_ComputerGetMemory

https://github.com/cornernote/autoit-poker_bot/blob/master/includes/vendor/CompInfo/CompInfo.au3

hljkwan 发表于 2021-10-26 17:49:51

虫子樱桃 发表于 2021-10-26 14:01
https://github.com/cornernote/autoit-poker_bot/blob/master/includes/vendor/CompInfo/CompInfo.au3

万分感谢~~~!

hljkwan 发表于 2021-10-26 18:08:19

本帖最后由 hljkwan 于 2021-10-26 18:16 编辑

虫子樱桃 发表于 2021-10-26 14:01
https://github.com/cornernote/autoit-poker_bot/blob/master/includes/vendor/CompInfo/CompInfo.au3
不好意思,打扰了,这是怎么回事了

afan 发表于 2021-10-26 19:21:56

hljkwan 发表于 2021-10-26 18:08
不好意思,打扰了,这是怎么回事了

#include 了就不需要再复制上面的函数定义了,已经包含了,直接使用 _ComputerGetMemory

sh1536 发表于 2021-10-26 20:10:32

本帖最后由 sh1536 于 2021-10-26 20:15 编辑

一次查询所有的内存设备WIN32的所有属性,借用樱桃大神的代码更新下,顺便做个标记,下次用的时候方便
“.Manufacturer”这个属性获得品牌的英文名字,要获得中文名字,最好再封装一个函数“.MemoryType”理论上这个属性可以获得内存类型,但是我在自己电脑上测试获得是0,官方文件也说“May not be available”,可以通过
“.Speed”这个属性来判断是第几代,不过需要再封装一个函数,一般速率和代数是对应的
PS:论坛的代码上传怎么会少一个 \
第19行掉了一个符号,改为:$objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
#include <Array.au3>

$Result = _ComputerGetMemory()
_ArrayDisplay($Result, "WMI类 - Win32_PhysicalMemory 所有属性(内存条)", "", 0, Default, _
                        '属性|库标签|容量(单位KB)|描述|时钟速度|电压|类名|内存带宽|描述|设备定位器|' & _
                        '存在形式|是否支持热插拔|安装日期(无值)|数据交错深度|交错的位置|生产商|最大电压|' & _
                        '内存类型|最小电压|型号|名字|其他识别信息|零件编号|行位置|是否接通电源|是否可拆卸|' & _
                        '是否可更换|编号|SKU|SMBIOS内存类型|速率|状态|标签|总宽度(位)|类型详细信息|版本信息')

Func _ComputerGetMemory()
      ;https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-physicalmemory
      ;2021.07.01
      Local $wbemFlagReturnImmediately = 0x10
      Local $wbemFlagForwardOnly       = 0x20
      Local $cI_CompName = @ComputerName
      Local $colItems, $objWMIService, $objItem
      Dim $aMemoryInfo, $i = 1

      $objWMIService = ObjGet("winmgmts:\\" & $cI_CompName & "\root\CIMV2")
      $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_PhysicalMemory", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
      If IsObj($colItems) Then
                For $objItem In $colItems
                        ReDim $aMemoryInfo
                        $aMemoryInfo[$i]         = $objItem.Attributes         ;属性
                        $aMemoryInfo[$i]         = $objItem.BankLabel            ;库标签
                        $aMemoryInfo[$i]         = $objItem.Capacity             ;容量(单位KB)
                        $aMemoryInfo[$i]         = $objItem.Caption            ;描述
                        $aMemoryInfo[$i]         = $objItem.ConfiguredClockSpeed ;时钟速度
                        $aMemoryInfo[$i]         = $objItem.ConfiguredVoltage    ;电压
                        $aMemoryInfo[$i]         = $objItem.CreationClassName    ;类名
                        $aMemoryInfo[$i]         = $objItem.DataWidth            ;内存带宽
                        $aMemoryInfo[$i]         = $objItem.Description          ;描述
                        $aMemoryInfo[$i]         = $objItem.DeviceLocator      ;设备定位器
                        $aMemoryInfo[$i]      = $objItem.FormFactor         ;存在形式
                        $aMemoryInfo[$i]      = $objItem.HotSwappable         ;是否支持热插拔
                        $aMemoryInfo[$i]      = $objItem.InstallDate          ;安装日期(无值)
                        $aMemoryInfo[$i]      = $objItem.InterleaveDataDepth;数据交错深度
                        $aMemoryInfo[$i]      = $objItem.InterleavePosition   ;交错的位置
                        $aMemoryInfo[$i]      = $objItem.Manufacturer         ;生产商
                        $aMemoryInfo[$i]      = $objItem.MaxVoltage         ;最大电压
                        $aMemoryInfo[$i]      = $objItem.MemoryType         ;内存类型
                        $aMemoryInfo[$i]      = $objItem.MinVoltage         ;最小电压
                        $aMemoryInfo[$i]      = $objItem.Model                ;型号
                        $aMemoryInfo[$i]      = $objItem.Name               ;名字
                        $aMemoryInfo[$i]      = $objItem.OtherIdentifyingInfo ;其他识别信息
                        $aMemoryInfo[$i]      = $objItem.PartNumber         ;零件编号
                        $aMemoryInfo[$i]      = $objItem.PositionInRow      ;行位置
                        $aMemoryInfo[$i]      = $objItem.PoweredOn            ;是否接通电源
                        $aMemoryInfo[$i]      = $objItem.Removable            ;是否可拆卸
                        $aMemoryInfo[$i]      = $objItem.Replaceable          ;是否可更换
                        $aMemoryInfo[$i]      = $objItem.SerialNumber         ;编号
                        $aMemoryInfo[$i]      = $objItem.SKU                  ;SKU
                        $aMemoryInfo[$i]      = $objItem.SMBIOSMemoryType   ;SMBIOS内存类型
                        $aMemoryInfo[$i]      = $objItem.Speed                ;速率
                        $aMemoryInfo[$i]      = $objItem.Status               ;状态
                        $aMemoryInfo[$i]      = $objItem.Tag                  ;标签
                        $aMemoryInfo[$i]      = $objItem.TotalWidth         ;总宽度(位)
                        $aMemoryInfo[$i]      = $objItem.TypeDetail         ;类型详细信息
                        $aMemoryInfo[$i]      = $objItem.Version            ;版本信息
                        $i += 1
                Next
                $aMemoryInfo = UBound($aMemoryInfo) - 1                   ;内存条数量
                If $aMemoryInfo < 1 Then
                        Return SetError(1, 1, 0)
                EndIf
      Else
                Return SetError(1, 2, 0)
      EndIf
      Return SetError(0, 0, $aMemoryInfo)
EndFunc ;_ComputerGetMemory




hljkwan 发表于 2021-10-26 20:28:33

afan 发表于 2021-10-26 19:21
#include 了就不需要再复制上面的函数定义了,已经包含了,直接使用 _ComputerGetMemory

好的,非常感谢

hljkwan 发表于 2021-10-26 20:31:17

sh1536 发表于 2021-10-26 20:10
一次查询所有的内存设备WIN32的所有属性,借用樱桃大神的代码更新下,顺便做个标记,下次用的时候方便
“. ...

感谢~~感谢~~感谢

hljkwan 发表于 2021-10-26 20:47:07

sh1536 发表于 2021-10-26 20:10
一次查询所有的内存设备WIN32的所有属性,借用樱桃大神的代码更新下,顺便做个标记,下次用的时候方便
“. ...

是否可以直接使用#incude使用?目测使用后软件无法打开

sh1536 发表于 2021-10-26 20:50:51

hljkwan 发表于 2021-10-26 20:47
是否可以直接使用#incude使用?目测使用后软件无法打开

把我发的代码单独放在一个文件里是否可以正常运行,正常是要弹出一个窗口的,注意改一下第19行

hljkwan 发表于 2021-10-26 20:58:20

sh1536 发表于 2021-10-26 20:50
把我发的代码单独放在一个文件里是否可以正常运行,正常是要弹出一个窗口的,注意改一下第19行

运行正常,但是窗口是不弹出的

hljkwan 发表于 2021-10-26 20:59:55

sh1536 发表于 2021-10-26 20:50
把我发的代码单独放在一个文件里是否可以正常运行,正常是要弹出一个窗口的,注意改一下第19行

直接就结束了,没有任何弹窗显示

sh1536 发表于 2021-10-26 21:02:38

MsgBox(0, "", @error ? @error : "运行正常")

把这一行加在第三行下面,看下提示的是什么

hljkwan 发表于 2021-10-26 21:05:35

sh1536 发表于 2021-10-26 21:02
把这一行加在第三行下面,看下提示的是什么

一样,没有任何提示,正常运行

sh1536 发表于 2021-10-26 21:10:46

你电脑是win7吧,我是在win10上测试的,刚在虚拟机里试了确实是有问题的,再改一下
页: [1] 2
查看完整版本: 【已解决】怎么获取内存的品牌和几代