2

Delphi で、実行時に現在実行しているコンピューターの IP サブネット マスクを取得できる方法を探しています。

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

4

2 に答える 2

5

Win32_NetworkAdapterConfiguration WMI クラスとプロパティを使用できIPSubnetます。

このサンプルコードを試してください

{$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. 
于 2012-08-28T14:57:08.573 に答える
0

1) コンピュータが異なるネット/サブネットに属している可能性があります。通常、各ネットワーク アダプタにはいくつかのアダプタがあります。または、複数の場合もあります。

2) 物理的にネットワーク カードが 1 つしかない場合でも、ypou にはループバックネットワーク (127.xxx サブネット) もあります。Hamachi や Comodo などの VPN がインストールされている場合は、ネットワーク アダプターが 1 つ増えます。接続時の電話モデムも同様です。XP 互換モードなどの仮想マシンでも同じです。とにかく、いくつかの基準でそれらをフィルタリングする必要があります。

3) WMI の FindAdaptor 機能でネットワーク カードを登録できます: http://www.magsys.co.uk/delphi/magwmi.asp 次に、それらのアダプタのプロパティを読み取ることができます。IP を設定する機能についても言及されていますが、おそらくそれらを読み取る機能もあります。

そうでない場合でも、プロパティの読み取り方法は、URL のデモに示されています。どのプロパティを読み取るかは、WMI エクスプローラーを使用して決定できます。個人的には、ks-soft.net の WMI Explorer と Microsoft の WMI Tools で終わりました。SQLite で行うように WMI 要求をデバッグし、それを WMI ラッパーに渡して結果を読み取ります。ただし、前述の Set IP Address 関数に戻ると、それらのソースにはおそらく、探索の手間を省くために、既にプロパティ名が含まれています。

于 2012-08-28T12:01:49.857 に答える