1

Windows Server 2008を使用していますが、DNSサーバーを取得したいと考えています。そのため、最速の方法はipconfigを実行してから、TProcessを使用してその出力を解析することだと考えました。

私はこのコードを思いついた:

  var
  proces : TProcess;
  begin
  ...
  proces := TProcess.Create(nil);
  proces.Executable := 'ipconfig';
  proces.Options := proces.Options + [poWaitOnExit,poUsePipes];
  try
  proces.Execute;
  except
        proces.Free;
  end;
  SetLength(rez,proces.Output.NumBytesAvailable);
  proces.Output.Read(rez[1],proces.Output.NumBytesAvailable);
  ShowMessage(rez);

コードは機能しますが、コンソールウィンドウを手動で閉じた後、試しpoNoConsoleましたが、同じ結果が得られましたが、プロセスipconfigはタスクマネージャーでアクティブなままです。

コンソールアプリケーションのipconfigが終了しないのはなぜですか?私がそれを実行すると、stdout情報を吐き出した後に終了します。

それは私の構成ですか?バグですか?ヘルプ!ありがとう :)

4

1 に答える 1

1

ipconfigは大量の出力を生成する可能性があるため、一度に読み取ろうとしないでください。wikiのReadinglargeoutputメソッドを使用してください

FPC(2.6.2)の次の反復には、一連の一般的なケースのtprocessを計測し、単一の文字列で出力を返す一連のrunco ​​mmandプロシージャが含まれます。

注APIソリューションも可能です。

{$mode delphi}

uses  JwaIpExport, JwaIpRtrMib, JwaIpTypes,jwawinerror,classes,jwaiphlpapi;

procedure GetDNSServers(AList: TStringList);
var
  pFI: PFixed_Info;
  pIPAddr: PIPAddrString;
  OutLen: Cardinal;
begin
  AList.Clear;
  OutLen := SizeOf(TFixedInfo);
  GetMem(pFI, SizeOf(TFixedInfo));
  try
    if GetNetworkParams(pFI, OutLen) = ERROR_BUFFER_OVERFLOW then
    begin
      ReallocMem(pFI, OutLen);
      if GetNetworkParams(pFI, OutLen) <> NO_ERROR then Exit;
    end;
    // If there is no network available there may be no DNS servers defined
    if pFI^.DnsServerList.IpAddress.s[0] = #0 then Exit;
    // Add first server
    AList.Add(pFI^.DnsServerList.IpAddress.s);
    // Add rest of servers
    pIPAddr := pFI^.DnsServerList.Next;
    while Assigned(pIPAddr) do
    begin
      AList.Add(pIPAddr^.IpAddress.s);
      pIPAddr := pIPAddr^.Next;
    end;
  finally
    FreeMem(pFI);
  end;
end;

var v : TStringList; 
    s : string;
begin
 v:=tstringlist.create;
 getdnsservers(v);
 for s in v do writeln(s);   // this probably requires 2.6+
 v.free;
end.
于 2013-01-04T18:00:34.290 に答える