全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1356
推到 Plurk!
推到 Facebook!

关於DNS server的地址问题

尚未結案
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-19 18:41:20 IP:210.78.xxx.xxx 未訂閱
请问怎样可以获取DNS server的地址?
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-19 19:05:14 IP:202.39.xxx.xxx 未訂閱
http://groups.google.com.tw/groups?hl=zh-TW&lr=&ie=UTF-8&oe=UTF-8&th=33d4984e8154d109&rnum=7    產生一個如下的 unit 使用 unit 中的 GetDnsIp 即可回傳 DNS 的 IP
unit BaclDnsHelper;    interface    uses
  SysUtils,
  Classes,
  Windows;    function GetDnsIp : string;    implementation    const
  //
  // NOTE: For '9x, we must use /batch  or the GUI will appear so
  // we use a dummy file
  //
  IPCFG_DUMMY_FILE      = '_dmytmpdns.tmp';
  IPCFG_WIN9X   = 'winipcfg.exe /all /batch ';// _dmytmpgdns.txt';
  IPCFG_WINNT   = 'ipconfig.exe /all';      IPCFG_DNS_SERVER_LINE = 'DNS Servers';      REG_NT_NAMESERVER_PATH        =
    'System\CurrentControlSet\Services\Tcpip\Parameters';
  REG_NT_NAMESERVER             = 'DhcpNameServer';      REG_9X_NAMESERVER_PATH        = 'System\CurrentControlSet\Services\MSTCP';
  REG_9X_NAMESERVER             = 'NameServer';    function BackSlashStr (const s : string) : string;
begin
  Result := s;
  if Result[Length(Result)] <> '\' then
    Result := Result   '\';
end;    function GetWindowsPath : string;
var
  Temp  : array [0..MAX_PATH] of char;
begin
  GetWindowsDirectory (Temp, SizeOf(Temp));
  Result := BackSlashStr (Temp);
end;    function GetSystemPath : string;
var
  Temp  : array [0..MAX_PATH] of char;
begin
  GetSystemDirectory (Temp, SizeOf(Temp));
end;    function LooksLikeIP(StrIn: string): boolean;
var
  IPAddr : string;
  period, octet, i : Integer;
begin
  result := false;  // default
  IPAddr := StrIn;
  for i := 1 to 4 do begin
    if i = 4 then period := 255 else period := pos('.',IPAddr);
    if period = 0 then exit;
    try
      octet := StrToInt(copy(IPAddr,1,period - 1));
    except
      exit;
    end;  // below, octet < 1 if i = 1, < 0 if i > 1
    if (octet < (1 div i)) or (octet > 254) then exit;
    if i = 4 then result := true else IPAddr := copy(IPAddr,period 1,255);
  end;
end;    procedure GetConsoleOutput (const CommandLine : string;
  var Output : TStringList);
var
  SA: TSecurityAttributes;
  SI: TStartupInfo;
  PI: TProcessInformation;
  StdOutFile, AppProcess, AppThread : THandle;
  RootDir, WorkDir, StdOutFileName:string;
const
  FUNC_NAME = 'GetConsoleOuput';
begin
  try
    StdOutFile:=0;
    AppProcess:=0;
    AppThread:=0;        // Initialize dirs
    RootDir:=ExtractFilePath(ParamStr(0));
    WorkDir:=ExtractFilePath(CommandLine);        // Check WorkDir
    if not (FileSearch(ExtractFileName(CommandLine),WorkDir)<>'') then
      WorkDir:=RootDir;        // Initialize output file security attributes
    FillChar(SA,SizeOf(SA),#0);
    SA.nLength:=SizeOf(SA);
    SA.lpSecurityDescriptor:=nil;
    SA.bInheritHandle:=True;        // Create Output File
    StdOutFileName:=RootDir 'output.tmp';
    StdOutFile:=CreateFile(PChar(StdOutFileName),
                   GENERIC_READ or GENERIC_WRITE,
                   FILE_SHARE_READ or FILE_SHARE_WRITE,
                   @SA,
                   CREATE_ALWAYS, // Always create it
                   FILE_ATTRIBUTE_TEMPORARY or // Will cache in memory
                                               // if possible
                   FILE_FLAG_WRITE_THROUGH,
                   0);        // Check Output Handle
    if StdOutFile = INVALID_HANDLE_VALUE then
      raise Exception.CreateFmt('Function %s() failed!'   #10#13  
        'Command line = %s',[FUNC_NAME,CommandLine]);        // Initialize Startup Info
    FillChar(SI,SizeOf(SI),#0);
    with SI do begin
      cb:=SizeOf(SI);
      dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      wShowWindow:=SW_HIDE;
      hStdInput:=GetStdHandle(STD_INPUT_HANDLE);
      hStdError:=StdOutFile;
      hStdOutput:=StdOutFile;
    end;        // Create the process
    if CreateProcess(nil, PChar(CommandLine), nil, nil,
                     True, 0, nil,
                     PChar(WorkDir), SI, PI) then begin
      WaitForSingleObject(PI.hProcess,INFINITE);
      AppProcess:=PI.hProcess;
      AppThread:=PI.hThread;
      end
    else
      raise Exception.CreateFmt('CreateProcess() in function %s() failed!'
                     #10#13   'Command line = %s',[FUNC_NAME,CommandLine]);        CloseHandle(StdOutFile);
    StdOutFile:=0;        Output.Clear;
    Output.LoadFromFile (StdOutFileName);      finally
    // Close handles
    if StdOutFile <> 0 then CloseHandle(StdOutFile);
    if AppProcess <> 0 then CloseHandle(AppProcess);
    if AppThread <> 0 then CloseHandle(AppThread);        // Delete Output file
    if FileExists(StdOutFileName) then
      SysUtils.DeleteFile(StdOutFileName);
  end;
end;    function GetBasicOsType : LongWord;
var
  VerInfo       : TOsVersionInfo;
begin
  VerInfo.dwOSVersionInfoSize := SizeOf(VerInfo);
  GetVersionEx (VerInfo);
  Result := VerInfo.dwPlatformId;
end;    function GetIpCfg9xOutPath : string;
begin
  Result := GetWindowsPath   IPCFG_DUMMY_FILE;
end;    function GetIpCfgExePath : string;
begin
  Result := '';
  Case GetBasicOsType of
    VER_PLATFORM_WIN32_WINDOWS  : Result := GetWindowsPath   IPCFG_WIN9X  
      GetIpCfg9xOutPath;
    VER_PLATFORM_WIN32_NT       : Result := GetSystemPath   IPCFG_WINNT;
  end;
end;    function GetDnsIpFromReg : string;
var
  OpenKey       : HKEY;
  Vn,
  SubKey        : PChar;
  DataType,
  DataSize      : integer;
  Temp          : array [0..2048] of char;
begin
  Result := '';
  SubKey := '';
  Vn := '';
  case GetBasicOsType of
    VER_PLATFORM_WIN32_WINDOWS  :
    begin
      SubKey := REG_9X_NAMESERVER_PATH;
      Vn := REG_9X_NAMESERVER;
    end;
    VER_PLATFORM_WIN32_NT       :
    begin
      SubKey := REG_NT_NAMESERVER_PATH;
      Vn := REG_NT_NAMESERVER;
    end;
  end;
  if RegOpenKeyEx (HKEY_LOCAL_MACHINE, SubKey, REG_OPTION_NON_VOLATILE,
    KEY_READ, OpenKey) = ERROR_SUCCESS then
  begin
    DataType := REG_SZ;
    DataSize := SizeOf(Temp);
    if RegQueryValueEx (OpenKey, Vn, nil, @DataType, @Temp,
      @DataSize) = ERROR_SUCCESS then
      Result := string(Temp);
    RegCloseKey (OpenKey);
  end;
end;    function GetDnsIpFromIpCfgOut (const Output : TStringList;
  var DnsIp : string) : boolean;
var
  i     : integer;
begin
  Result := FALSE;
  if Output.Count >= 1 then
    for i := 0 to Output.Count - 1 do
    begin
      if Pos(IPCFG_DNS_SERVER_LINE, Output[i]) > 0 then
      begin
        DnsIp := Trim(Copy (Output[i], Pos(':', Output[i]) 1,
          Length(Output[i])));
        Result := LooksLikeIp (DnsIp);
      end;
    end;
end;    function GetDnsIp : string;
var
  Output        : TStringList;
  DnsIp,
  CmdLine       : string;
begin
  CmdLine := GetIpCfgExePath;
  if CmdLine <> '' then
  begin
    Output := TStringList.Create;
    try
      case GetBasicOsType of
        VER_PLATFORM_WIN32_WINDOWS :
        begin
          GetConsoleOutput (CmdLine, Output);
          Output.LoadFromFile (GetIpCfg9xOutPath);
        end;
        else
          GetConsoleOutput (CmdLine, Output);
      end;
      if GetDnsIpFromIpCfgOut (Output, DnsIp) then
        Result := DnsIp
      else
      begin
        //
        // Attempt to locate via registry
        //
        Result := GetDnsIpFromReg;
      end;
    finally
      Output.Free;
    end;
  end;
end;    end.
--- 屬於那自己生命的歌 不管是什麼顏色
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-19 19:36:57 IP:210.78.xxx.xxx 未訂閱
除了调到外部程序并接收返回值这个方法以外, 有没更好的方法? 我不想调用外部程序 谢谢
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-02-12 08:07:54 IP:61.219.xxx.xxx 訂閱

顯示本機設定的 DNS Server IP (Delphi 範例)
http://delphi.ktop.com.tw/board.php?cid=31&fid=77&tid=86802
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-04-26 13:50:13 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-05-06 12:38:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!