这个是使用WMI读取系统信息的部分代码
  Wmi:= CreateOleObject('WbemScripting.SWbemLocator');
  Objs := Wmi.ConnectServer('.','root\cimv2').ExecQuery('Select * from Win32_NetworkAdapterConfiguration WHERE IPEnabled = true',,48);
  Enum:=IEnumVariant(IUnknown(Objs._NewEnum));
  Enum.Reset;
  Enum.Next(1,Obj,C);
这些都没有什么问题,但是我用
labIP.Caption := Obj.Properties_.Item('IPAddress(0)',0).Value;
来获取IP地址的时候,系统报“找不到”,但是,如下
labMAC.Caption := Obj.Properties_.Item('MACAddress',0).Value;
却可以找到本机的MAC地址。
使用微软的WMI工具得到的VBS代码是这样的
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where ipenabled = true",,48)
For Each objItem in colItems
    Wscript.Echo "IPAddress: " & objItem.IPAddress(0) 
    Wscript.Echo "MACAddress: " & objItem.MACAddress
Next
最后那里是用的IPAddress(0),如果是IPAddress,也有类似“找不到”的错误
不过如果使用IPAddress(0)在Delphi中,好像就不能用了
到底这个(0)应该在什么地方使用才能正确显示IP呢。  

解决方案 »

  1.   

    直接写IPAddress应该可以的var
      WMi, Objs, Obj, Value: OleVariant;
      Enum: IEnumVariant;
      C: Cardinal;
      s: array of string;
      i: Integer;
      Name, IP: string;
    begin
      IP := '';
      Wmi:= CreateOleObject('WbemScripting.SWbemLocator');
      Objs := Wmi.ConnectServer('.','root\cimv2')
       .ExecQuery('Select * from Win32_NetworkAdapterConfiguration where IPEnabled!=0');
      Enum := IEnumVariant(IUnknown(Objs._NewEnum));
      Enum.Reset;
      C := 0;
      while Succeeded(Enum.Next(1, Obj, C)) and (C > 0) do
      begin
        begin
          Name := Obj.Properties_.Item('Description', 0).Value;
          s := Obj.Properties_.Item('IPAddress', 0).Value;
          IP := IP + Name + #13#10;
          for i := 0 to High(s) do IP := IP + (s[i]) + #13#10;
          IP := IP + #13#10;
        end;
      end;
      ShowMessage(IP);
    end;
      

  2.   

    原来很简单,因为获得的IP就是一个数组,所以显示不出来
    把数组的第一个值取出来就可以,代码实现虽然笨了点,不过
    还是实现效果了labMAC.Caption := Obj.Properties_.Item('MACAddress',0).Value;  Obj := Obj.Properties_.Item('IPAddress',0).Value;
      Obj := Obj[0];
      labIP.Caption := Obj;
    必须要先显示MAC,再对Obj变量进行处理,显示IP,呵呵。
    楼上的方法好像不行,代码不处理啊。