Пример получения CPU ID:
- Код: Выделить всё
Set objWMIService = GetObject("winmgmts:\\" & STR_COMP & "\root\CIMV2")
Set objColItems = objWMIService.ExecQuery("SELECT * FROM Win32_Processor", , 48)
For Each objColItem In objColItems
strCPUID = objColItem.ProcessorId
Next
Подобный код генерируют и различные генераторы кода такие как WMICodeCreator, Scriptomatic и другие. Однако запросы вида SELECT * FROM выполняются крайне медленно, почему это проиходит, я и хотел спросить у форумчан.
То-же запрос, но более конкретизированный: "SELECT ProcessorId FROM Win32_Processor" выполняется на порядок быстрее. Естественно это можно было-бы объяснить тем, что в первом случае запрос выбирает большее количество элементов коллекции и задержка связанна именно с этим.
Тогда по идее самым быстрым вариантом должен быть вариант с прямым полученим объекта:
GetObject("winmgmts:Win32_Processor='CPU0'").
Делаю небольшую тестовую программку:
- Код: Выделить всё
Sum Main()
Dim objWMIService As Object
Dim objColItems As Object, objColItem As Object
Dim strCPUID As String, strMBID As String
Dim Time11, Time12, Time13, Time14
Const STR_COMP As String = "."
Time11 = Timer
'======= Вариант 1 (самый быстрый) ========
Set objWMIService = GetObject("winmgmts:\\" & STR_COMP & "\root\CIMV2")
Set objColItems = objWMIService.ExecQuery("SELECT ProcessorId FROM Win32_Processor", , 48)
For Each objColItem In objColItems
strCPUID = objColItem.ProcessorId
Next
Set objColItems = objWMIService.ExecQuery("SELECT SerialNumber FROM Win32_BaseBoard", , 48)
For Each objColItem In objColItems
strMBID = objColItem.SerialNumber
Next
Time12 = Timer
'======= Вариант 2 =======
Set objWMIService = GetObject("winmgmts:\\" & STR_COMP & "\root\CIMV2")
Set objColItems = objWMIService.ExecQuery("SELECT * FROM Win32_Processor", , 48)
For Each objColItem In objColItems
strCPUID = objColItem.ProcessorId
Next
Set objColItems = objWMIService.ExecQuery("SELECT * FROM Win32_BaseBoard", , 48)
For Each objColItem In objColItems
strMBID = objColItem.SerialNumber
Next
Time13 = Timer
'====== Вариант 3 =======
Set objWMIService = GetObject("winmgmts:Win32_Processor='CPU0'")
strCPUID = objWMIService.ProcessorId
Set objWMIService = GetObject("winmgmts:Win32_BaseBoard='Base Board'")
strMBID = objWMIService.SerialNumber
Time14 = Timer
MsgBox "Вариант 1 - " & Time12 - Time11 & vbCrLf & _
"Вариант 2 - " & Time13 - Time12 & vbCrLf & _
"Вариант 3 - " & Time14 - Time13 & vbCrLf & _
"CPU - " & strCPUID & vbCrLf & "MB - " & strMBID, vbInformation
End Function
Тестирую и сильно удивляюсь - вариант с непосредственным полученим объекта, по времени исполнения такой же как и SELECT * FROM .
Ради интереса подключаю библиотеку Microsoft WMI Scripting V1.2 Library, объявляю переменные с соответсвующими типами, вместо типа Object и ситуация в принципе остается без изменений.
Кто может объяснить такое поведение?