Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
lblSystemSerialNumbers.Text = SystemSerialNumber()
lblCpuIds.Text = CpuId()
End Sub
Private Function SystemSerialNumber() As String
' Get the Windows Management Instrumentation object.
Dim wmi As Object = GetObject("WinMgmts:")
' Get the "base boards" (mother boards).
Dim serial_numbers As String = ""
Dim mother_boards As Object = wmi.InstancesOf("Win32_BaseBoard")
For Each board As Object In mother_boards
serial_numbers &= ", " & board.SerialNumber
Next board
If serial_numbers.Length > 0 Then serial_numbers = serial_numbers.Substring(2)
Return serial_numbers
End Function
Private Function CpuId() As String
Dim computer As String = "."
Dim wmi As Object = GetObject("winmgmts:" & _
"{impersonationLevel=impersonate}!\\" & _
computer & "\root\cimv2")
Dim processors As Object = wmi.ExecQuery("Select * from Win32_Processor")
Dim cpu_ids As String = ""
For Each cpu As Object In processors
cpu_ids = cpu_ids & ", " & cpu.ProcessorId
Next cpu
If cpu_ids.Length > 0 Then cpu_ids = cpu_ids.Substring(2)
Return cpu_ids
End Function
End Class
このコードは、CPU IDとマザーボードIDを取得します。オプションstrictがオンの場合でも、これが確実に機能するようにするにはどうすればよいですか。このコードをオプションstrictでオンにするにはどうすればよいですか?
なぜこれが問題になりますか?
さて、見てみましょう。 wmiのタイプはObjectです。 wmiはInstancesOf、SerialNumberなどのメソッドを必ずしもサポートしていません
これをどうやって引き出すことができますか?
私がGetObjectから得たオブジェクトは純粋なオブジェクトではないと思います。私はそれをより適切なタイプにキャストまたは直接キャストすべきだと思います。より適切な型は、InstancesOf、SerialNumberなどのメソッドをサポートします。
しかし、適切な型は何ですか?
GetObjectを変更して、ManagementObjectSearcherとそのクラスを使用しようとしましたか? – Steve
私はそれが意味することを理解していません –
wmiのタイプはcomオブジェクトです。 ctypeを実行できるラッパークラスはありますか?それはあなたが意味することですか? –