I used the code posted by Serge. It works for PIII, Mobile PII, but somehow it did not shows the right speed for P4 1.9GHz CPU, and the worst is it shows o on the PIII laptops. Anybody has any idea what is going on ? I check the "wbemdisp.tlb" file which attached with the package shows a very old date (12/7/1999), not sure this is the root cause. How can we get the latest one ? Any channel to ask the Microsoft engineers ?

VB Code:
  1. Option Explicit
  2. Private m_arrCPU() As String
  3. Private m_objCPUSet As SWbemObjectSet
  4. Private m_objWMINameSpace As SWbemServices
  5.  
  6.  
  7.  
  8.  
  9. Private Sub Form_Load()
  10.     Dim objCPU As SWbemObject 'WMI Object
  11.     Dim strPath As String
  12.     Dim strCaption As String
  13.     Dim lngElement As Long
  14.    
  15.     ReDim m_arrCPU(0) As String
  16.  
  17.     On Error GoTo ErrorHandler
  18.  
  19.     Set m_objWMINameSpace = GetObject("winmgmts:")
  20.     lstCPU.Clear
  21.  
  22.  
  23.     Set m_objCPUSet = m_objWMINameSpace.InstancesOf("Win32_Processor")
  24.    
  25.     strCaption = m_objCPUSet.Count & " processor"
  26.     If m_objCPUSet.Count <> 1 Then strCaption = strCaption & "s"
  27.     strCaption = strCaption & " detected on this machine"
  28.     lblTitle.Caption = strCaption
  29.                
  30.     For Each objCPU In m_objCPUSet
  31.         With objCPU
  32.             strPath = .Path_ & ""
  33.             If strPath <> "" Then
  34.                 lstCPU.AddItem .Name
  35.                 'save path to array, in case the machine has multiple CPUs,
  36.                 'each can be identified and their info loaded if needed
  37.                
  38.                 lngElement = IIf(m_arrCPU(0) = "", 0, UBound(m_arrCPU) + 1)
  39.                 ReDim Preserve m_arrCPU(lngElement) As String
  40.                 m_arrCPU(lngElement) = strPath
  41.             End If
  42.         End With
  43.     Next
  44.     If lstCPU.ListCount <> 0 Then lstCPU.ListIndex = 0
  45.      
  46. ExitProc:
  47.     Set objCPU = Nothing
  48.  
  49.     Exit Sub
  50.  
  51. ErrorHandler:
  52.     MsgBox "CPU Information could not be displayed." & vbCrLf & Err.Description, , "Error"
  53.     Resume ExitProc
  54. End Sub
  55.  
  56. Private Sub Form_Unload(Cancel As Integer)
  57.     Set m_objCPUSet = Nothing
  58.     Set m_objWMINameSpace = Nothing
  59. End Sub
  60.  
  61. Private Sub lstCPU_Click()
  62.     Dim objCPU As SWbemObject
  63.     Dim strInfo As String
  64.  
  65.     On Error Resume Next
  66.  
  67.     Set objCPU = m_objCPUSet(m_arrCPU(lstCPU.ListIndex))
  68.     With objCPU
  69.         strInfo = "Description: " & .Description & vbCrLf
  70.         strInfo = strInfo & "Processor ID: " & .ProcessorID & vbCrLf
  71.         strInfo = strInfo & "Status: " & .Status & vbCrLf
  72.         strInfo = strInfo & "Manufacturer: " & .Manufacturer & vbCrLf
  73.         strInfo = strInfo & "Availability: " & AvailabilityToString(.Availability) & vbCrLf
  74.         strInfo = strInfo & "Load Percentage: " & .LoadPercentage & vbCrLf
  75.         strInfo = strInfo & "Current Clock Speed: " & .CurrentClockSpeed & " MHz" & vbCrLf
  76.         strInfo = strInfo & "Maximum Clock Speed: " & .MaxClockSpeed & vbCrLf
  77.         strInfo = strInfo & "Level 2 Cache Size: " & .L2CacheSize & vbCrLf
  78.         strInfo = strInfo & "Level 2 Cache Speed: " & .L2CacheSpeed & vbCrLf
  79.         strInfo = strInfo & "Power Management Supported: " & .PowerManagementSupported
  80.     End With
  81.     txtCpu.Text = strInfo
  82. End Sub
  83.  
  84. Private Function AvailabilityToString(p_intCode As Integer) As String
  85.     Dim strReturn As String
  86.    
  87.     'These return p_intCodes are based on WMI SDK Documentation
  88.    
  89.     Select Case p_intCode
  90.         Case 1, 2
  91.             strReturn = "Unknown"
  92.         Case 3
  93.             strReturn = "Running/Full Power"
  94.         Case 4
  95.             strReturn = "Warning"
  96.         Case 5
  97.             strReturn = "In Test"
  98.         Case 6
  99.             strReturn = "Not Applicable"
  100.         Case 7
  101.             strReturn = "Power Off"
  102.         Case 8
  103.             strReturn = "Off Line"
  104.         Case 9
  105.             strReturn = "Off Duty"
  106.         Case 10
  107.             strReturn = "Degraded"
  108.         Case 11
  109.             strReturn = "Not Installed"
  110.         Case 12
  111.             strReturn = "Install Error"
  112.         Case 13
  113.             strReturn = "Power Save - Unknown"
  114.         Case 14
  115.             strReturn = "Power Save - Low Power Mode"
  116.         Case 15
  117.             strReturn = "Power Save - Standby"
  118.         Case 16
  119.             strReturn = "Power Cycle"
  120.         Case 17
  121.             strReturn = "Power Save - Warning"
  122.         Case Else
  123.             strReturn = "Unknown"
  124.     End Select
  125.     AvailabilityToString = strReturn
  126. End Function
  127. --------------------------------------------------------------------------------