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 没有终止?如果我运行它,它会在吐出标准输出信息后退出。

是我的配置吗?这是一个错误吗?帮助!谢谢 :)

4

1 回答 1

1

由于 ipconfig 可以生成大量输出,所以不要试图一口气读完,使用 wiki 中的Reading large output方法。

FPC (2.6.2) 的下一次迭代将有一堆runco​​mmand过程,它们为一系列常见情况检测 tprocess 并以单个字符串返回输出。

注意 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 回答