2013-01-04 2 views
1

Windows Server 2008을 사용 중이고 DNS 서버를 가져 오려고합니다. 그래서 가장 빠른 방법은 ipconfig를 실행 한 다음 TProcess를 사용하여 출력을 구문 분석해야한다는 것입니다. 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 정보를 침을 뱉어 내고 나간다.

내 구성입니까? 그게 버그 야? 도움! 고마워요 :)

답변

1

ipconfig는 많은 양의 출력을 생성 할 수 있으므로 한 번에 읽지 않으려면 위키에서 Reading large output 메서드를 사용하십시오.

FPC (2.6.2)의 다음 반복은 일련의 일반적인 경우에 대해 tprocess를 수행하고 출력을 단일 문자열로 반환하는 절차가 runcommand 번 있습니다.

참고 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. 
+0

감사 sense.FPC 훌륭합니다 많은 : D는 API 버전/적은 64 비트 윈도우에 대한 검증되지 않은 JWA 단위를 사용하는 – opc0de

+1

참고. –

관련 문제