Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 팁&트릭
Delphi Programming Tip&Tricks
[204] IP 설정 바꾸기
civilian,안영제 [civilian] 8155 읽음    2006-12-18 20:38
uses ComObj, ActiveX, UrlMon; 

// ====================================================================== 
// SetIpConfig() 
// Set IPAddress, Gateway and Subnetmask via WMI 
// Arguments ... 
// AIpAddress - If Null String or 'DHCP' then DHCP is ENABLED 
//              else STATIC IP is set. 
// AGateWay   - [Optional] If Omitted then GATEWAY is left unchanged. 
// SubnetMask - [Optional] If Omited then default = '255.255.255.0'. 
// 
// SetDnsServers() 
// Set  DNS Servers via WMI 
// Arguments ... 
// APrimaryDNS   - If Null String then DNS Server List is CLEARED. 
// AAlternateDNS - [Optional] 
// 
// Return Values ... 
//   0 Successful completion, no reboot required. 
//   1 Successful completion, reboot required. 
//  -1 Unknown OLE Error 
//  64 Method not supported on this platform. 
//  65 Unknown failure. 
//  66 Invalid subnet mask. 
//  67 An error occurred while processing an instance that was returned. 
//  68 Invalid input parameter. 
//  69 More than five gateways specified. 
//  70 Invalid IP address. 
//  71 Invalid gateway IP address. 
//  72 An error occurred while accessing the registry for the info. 
//  73 Invalid domain name. 
//  74 Invalid host name. 
//  75 No primary or secondary WINS server defined. 
//  76 Invalid file. 
//  77 Invalid system path. 
//  78 File copy failed. 
//  79 Invalid security parameter. 
//  80 Unable to configure TCP/IP service. 
//  81 Unable to configure DHCP service. 
//  82 Unable to renew DHCP lease. 
//  83 Unable to release DHCP lease. 
//  84 IP not enabled on adapter. 
//  85 IPX not enabled on adapter. 
//  86 Frame/network number bounds error. 
//  87 Invalid frame type. 
//  88 Invalid network number. 
//  89 Duplicate network number. 
//  90 Parameter out of bounds. 
//  91 Access denied. 
//  92 Out of memory. 
//  93 Already exists. 
//  94 Path, file, or object not found. 
//  95 Unable to notify service. 
//  96 Unable to notify DNS service. 
//  97 Interface not configurable. 
//  98 Not all DHCP leases could be released or renewed. 
//  100 DHCP not enabled on adapter. 
// ====================================================================== 


// ================================================================== 
// IP Address,Gateway and Subnet Mask 
// EnableStatic takes array of string as a parameter 
// for the Addresses. You may wish to rewrite this using 
// array of string as parameter for multiple IP Addresses. 
// I only have use for 1 IP address and Gateway in our application 
// but it's nice to be able to expand it for other users. 
// ================================================================== 

function SetIpConfig(const AIpAddress : string; 
                     const AGateWay : string = ''; 
                     const ASubnetMask : string = '') : integer; 
var Retvar : integer; 
    oBindObj : IDispatch; 
    oNetAdapters,oNetAdapter, 
    oIpAddress,oGateWay, 
    oWMIService,oSubnetMask : OleVariant; 
    i,iValue : longword; 
    oEnum : IEnumvariant; 
    oCtx : IBindCtx; 
    oMk : IMoniker; 
    sFileObj : widestring; 
begin 
  Retvar := 0; 
  sFileObj := 'winmgmts:\\.\root\cimv2'; 

  // Create OLE [IN} Parameters 
  oIpAddress := VarArrayCreate([1,1],varOleStr); 
  oIpAddress[1] := AIpAddress; 
  oGateWay := VarArrayCreate([1,1],varOleStr); 
  oGateWay[1] := AGateWay; 
  oSubnetMask := VarArrayCreate([1,1],varOleStr); 
  if ASubnetMask = '' then 
    oSubnetMask[1] := '255.255.255.0' 
  else 
    oSubnetMask[1] := ASubnetMask; 

  // Connect to WMI - Emulate API GetObject() 
  OleCheck(CreateBindCtx(0,oCtx)); 
  OleCheck(MkParseDisplayNameEx(oCtx,PWideChar(sFileObj),i,oMk)); 
  OleCheck(oMk.BindToObject(oCtx,nil,IUnknown,oBindObj)); 
  oWMIService := oBindObj; 

  oNetAdapters := oWMIService.ExecQuery('Select * from ' + 
                                        'Win32_NetworkAdapterConfiguration ' + 
                                        'where IPEnabled=TRUE'); 
  oEnum := IUnknown(oNetAdapters._NewEnum) as IEnumVariant; 

  while oEnum.Next(1,oNetAdapter,iValue) = 0 do begin 
    try 
      // Set by DHCP ? (Gateway and Subnet ignored) 
      if (AIpAddress = '') or SameText(AIpAddress,'DHCP') then 
        Retvar := oNetAdapter.EnableDHCP 
      // Set via STATIC ? 
      else begin 
        Retvar := oNetAdapter.EnableStatic(oIpAddress,oSubnetMask); 
        // Change Gateway ? 
        if (Retvar = 0) and (AGateWay <> '') then 
          Retvar := oNetAdapter.SetGateways(oGateway); 

        // *** This is where we need some sort of *** 
        // *** Network Mapped Resource Refresh    *** 
      end; 
    except 
      Retvar := -1; 
    end; 

    oNetAdapter := Unassigned; 
  end; 

  oGateWay := Unassigned; 
  oSubnetMask := Unassigned; 
  oIpAddress := Unassigned; 
  oNetAdapters := Unassigned; 
  oWMIService := Unassigned; 
  Result := Retvar; 
end; 


// ==================================================== 
// Set DNS Servers 
// Instead of Primary and Alternate you may wish 
// to rewrite this using array of string as the 
// parameters as SetDNSServerSearchOrder will take 
// a list of many DNS addresses. I only have use for 
// Primary and Alternate. 
// ==================================================== 

function SetDnsServers(const APrimaryDNS : string; 
                       const AAlternateDNS : string = '') : integer; 
var Retvar : integer; 
    oBindObj : IDispatch; 
    oNetAdapters,oNetAdapter, 
    oDnsAddr,oWMIService : OleVariant; 
    i,iValue,iSize : longword; 
    oEnum : IEnumvariant; 
    oCtx : IBindCtx; 
    oMk : IMoniker; 
    sFileObj : widestring; 
begin 
  Retvar := 0; 
  sFileObj := 'winmgmts:\\.\root\cimv2'; 
  iSize := 0; 
  if APrimaryDNS <> '' then inc(iSize); 
  if AAlternateDNS <> '' then inc(iSize); 

  // Create OLE [IN} Parameters 
  if iSize > 0 then begin 
   oDnsAddr := VarArrayCreate([1,iSize],varOleStr); 
   oDnsAddr[1] := APrimaryDNS; 
   if iSize > 1 then oDnsAddr[2] := AAlternateDNS; 
  end; 

  // Connect to WMI - Emulate API GetObject() 
  OleCheck(CreateBindCtx(0,oCtx)); 
  OleCheck(MkParseDisplayNameEx(oCtx,PWideChar(sFileObj),i,oMk)); 
  OleCheck(oMk.BindToObject(oCtx,nil,IUnknown,oBindObj)); 
  oWMIService := oBindObj; 

  oNetAdapters := oWMIService.ExecQuery('Select * from ' + 
                                        'Win32_NetworkAdapterConfiguration ' + 
                                        'where IPEnabled=TRUE'); 
  oEnum := IUnknown(oNetAdapters._NewEnum) as IEnumVariant; 

  while oEnum.Next(1,oNetAdapter,iValue) = 0 do begin 
    try 
      if iSize > 0 then 
        Retvar := oNetAdapter.SetDNSServerSearchOrder(oDnsAddr) 
      else 
        Retvar := oNetAdapter.SetDNSServerSearchOrder(); 
    except 
      Retvar := -1; 
    end; 

    oNetAdapter := Unassigned; 
  end; 

  oDnsAddr := Unassigned; 
  oNetAdapters := Unassigned; 
  oWMIService := Unassigned; 
  Result := Retvar; 
end; 


출처 : http://www.delphi3000.com
무능력 [sykelos]   2006-12-26 15:39 X
SameText라는 함수가 있는데 이 함수가 무엇일가여?
civilian,안영제 [civilian]   2006-12-26 17:04 X
SysUtils.pas에 포함된 표준 함수입니다.

이하 설명 :
SameText compares S1 and S2 and returns true if they are equal. SameText is not case sensitive and is not affected by the current locale.

+ -

관련 글 리스트
204 IP 설정 바꾸기 civilian,안영제 8155 2006/12/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.