Search code examples
delphimasksubnetidentify

Identifying subnet mask of the computer in Delphi


I am looking for a way to be able to retrieve IP Subnet mask of the computer I am currently running on at run time, in Delphi.

Is there a way in code for me to retrieve the subnet mask and store it so that I may use it in other operations?

Thanks


Solution

  • You can use the Win32_NetworkAdapterConfiguration WMI class and the IPSubnet property.

    Try this sample code

    {$APPTYPE CONSOLE}
    
    
    uses
      SysUtils,
      ActiveX,
      ComObj,
      Variants;
    
    function VarArrayToStr(const vArray: variant): string;
    
        function _VarToStr(const V: variant): string;
        var
        Vt: integer;
        begin
        Vt := VarType(V);
            case Vt of
              varSmallint,
              varInteger  : Result := IntToStr(integer(V));
              varSingle,
              varDouble,
              varCurrency : Result := FloatToStr(Double(V));
              varDate     : Result := VarToStr(V);
              varOleStr   : Result := WideString(V);
              varBoolean  : Result := VarToStr(V);
              varVariant  : Result := VarToStr(Variant(V));
              varByte     : Result := char(byte(V));
              varString   : Result := String(V);
              varArray    : Result := VarArrayToStr(Variant(V));
            end;
        end;
    
    var
    i : integer;
    begin
        Result := '[';
         if (VarType(vArray) and VarArray)=0 then
           Result := _VarToStr(vArray)
        else
        for i := VarArrayLowBound(vArray, 1) to VarArrayHighBound(vArray, 1) do
         if i=VarArrayLowBound(vArray, 1)  then
          Result := Result+_VarToStr(vArray[i])
         else
          Result := Result+'|'+_VarToStr(vArray[i]);
    
        Result:=Result+']';
    end;
    
    procedure  GetWin32_NetworkAdapterConfigurationInfo;
    const
      WbemUser            ='';
      WbemPassword        ='';
      WbemComputer        ='localhost';
      wbemFlagForwardOnly = $00000020;
    var
      FSWbemLocator : OLEVariant;
      FWMIService   : OLEVariant;
      FWbemObjectSet: OLEVariant;
      FWbemObject   : OLEVariant;
      oEnum         : IEnumvariant;
      iValue        : LongWord;
    begin;
      FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
      FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
      FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration Where IpEnabled=True','WQL',wbemFlagForwardOnly);
      oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
      while oEnum.Next(1, FWbemObject, iValue) = 0 do
      begin
        Writeln(Format('Caption       %s',[String(FWbemObject.Caption)]));// String
        if not VarIsNull(FWbemObject.DHCPServer) then
          Writeln(Format('DHCPServer    %s',[String(FWbemObject.DHCPServer)]));// String
        if not VarIsNull(FWbemObject.IPAddress) then
          Writeln(Format('IPAddress     %s',[VarArrayToStr(FWbemObject.IPAddress)]));// array String
    
        if not VarIsNull(FWbemObject.IPSubnet) then
          Writeln(Format('IPSubnet      %s',[VarArrayToStr(FWbemObject.IPSubnet)]));// array String
    
        if not VarIsNull(FWbemObject.MACAddress) then
          Writeln(Format('MACAddress     %s',[VarArrayToStr(FWbemObject.MACAddress)]));// array String
    
        Writeln;
        FWbemObject:=Unassigned;
      end;
    end;
    
    
    begin
     try
        CoInitialize(nil);
        try
          GetWin32_NetworkAdapterConfigurationInfo;
        finally
          CoUninitialize;
        end;
     except
        on E:EOleException do
            Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
        on E:Exception do
            Writeln(E.Classname, ':', E.Message);
     end;
     Writeln('Press Enter to exit');
     Readln;
    end.