王新年吧 关注:13贴子:314
  • 1回复贴,共1

用DELPHI制作程序更改电脑的IP地址

取消只看楼主收藏回复

  {   
  //   szData   中便是适配器详细描述   
  dwBufSize   =   256;   
  if(RegQueryValueEx(hSubKey,   "NetCfgInstanceID",   0,   &dwDataType,   szData,   &dwBufSize)   ==   ERROR_SUCCESS)   
  {   
  //   szData   中便是适配器名称   
  }   
  }   
  }   
  }   
  RegCloseKey(hNdiIntKey);   
  }   
  RegCloseKey(hSubKey);   
  }   
    
  dwBufSize   =   256;   
  } /*   end   of   while   */   
    
  RegCloseKey(hKey);   
  二、将IP信息写入注册表   
    
  代码如下:BOOL   RegSetIP(LPCTSTR   lpszAdapterName,   LPCTSTR   pIPAddress,   LPCTSTR   pNetMask,   LPCTSTR   pNetGate)   
  {   
  HKEY   hKey;   
  string   strKeyName   =   "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";   
  strKeyName   +=   lpszAdapterName;   
  if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,   
  strKeyName.c_str(),   
  0,   
  KEY_WRITE,   
  &hKey)   !=   ERROR_SUCCESS)   
  return   FALSE;   
    
  char   mszIPAddress[100];   
  char   mszNetMask[100];   
  char   mszNetGate[100];   
    
  strncpy(mszIPAddress,   pIPAddress,   98);   
  strncpy(mszNetMask,   pNetMask,   98);   
  strncpy(mszNetGate,   pNetGate,   98);   
    
  int   nIP,   nMask,   nGate;   
    
  nIP   =   strlen(mszIPAddress);   
  nMask   =   strlen(mszNetMask);   
  nGate   =   strlen(mszNetGate);   
    
  *(mszIPAddress   +   nIP   +   1)   =   0x00; //   REG_MULTI_SZ数据需要在后面再加个0   
  nIP   +=   2;   
    
  *(mszNetMask   +   nMask   +   1)   =   0x00;   
  nMask   +=   2;   
    
  *(mszNetGate   +   nGate   +   1)   =   0x00;   
  nGate   +=   2;   
    
  RegSetValueEx(hKey,   "IPAddress",   0,   REG_MULTI_SZ,   (unsigned   char*)mszIPAddress,   nIP);   
  RegSetValueEx(hKey,   "SubnetMask",   0,   REG_MULTI_SZ,   (unsigned   char*)mszNetMask,   nMask);   
  RegSetValueEx(hKey,   "DefaultGateway",   0,   REG_MULTI_SZ,   (unsigned   char*)mszNetGate,   nGate);   
    
  RegCloseKey(hKey);   
    
  return   TRUE;   
  }   
    
  三、调用DhcpNotifyConfigChange通知配置的改变   
    
  未公开函数DhcpNotifyConfigChange位于   dhcpcsvc.dll中,原型如下:   BOOL   DhcpNotifyConfigChange(   
          LPWSTR   lpwszServerName,   //   本地机器为NULL   
          LPWSTR   lpwszAdapterName,   //   适配器名称   
          BOOL   bNewIpAddress,   //   TRUE表示更改IP   
          DWORD   dwIpIndex,   //   指明第几个IP地址,如果只有该接口只有一个IP地址则为0   
          DWORD   dwIpAddress,   //   IP地址   
          DWORD   dwSubNetMask,   //   子网掩码   
          int   nDhcpAction   );   //   对DHCP的操作   0:不修改,   1:启用   DHCP,2:禁用   DHCP   
    
  具体调用代码如下:   BOOL   NotifyIPChange(LPCTSTR   lpszAdapterName,   int   nIndex,   LPCTSTR   pIPAddress,   LPCTSTR   pNetMask)   
  {   
  BOOL bResult   =   FALSE;   
  HINSTANCE hDhcpDll;   
  DHCPNOTIFYPROC pDhcpNotifyProc;   
  WCHAR   wcAdapterName[256];   
    
  MultiByteToWideChar(CP_ACP,   0,   lpszAdapterName,   -1,   wcAdapterName,256);   
    
  if((hDhcpDll   =   LoadLibrary("dhcpcsvc"))   ==   NULL)   
  return   FALSE;   
    
  if((pDhcpNotifyProc   =   (DHCPNOTIFYPROC)GetProcAddress(hDhcpDll,   "DhcpNotifyConfigChange"))   !=   NULL)   
  if((pDhcpNotifyProc)(NULL,   wcAdapterName,   TRUE,   nIndex,   inet_addr(pIPAddress),   inet_addr(pNetMask),   0)   ==   ERROR_SUCCESS)   
  bResult   =   TRUE;   
    
  FreeLibrary(hDhcpDll);   
  return   bResult;   
  }  



IP属地:湖北2楼2008-04-15 22:07
回复
    调用方法:SetLocalIP( tcCard,tcAddr, tcMask, tcGateWay,tcDNS,tcAddDNS ) 
     *!* *--------------------------------------------- 
     Function SetLocalIP( tcCard, tcAddr, tcMask, tcGateWay, tcDNS, tcAddDNS ) 
     tcCard = Iif(Type([tcCard])=[C], tcCard, [本地连接]) && 连接名称 
     tcAddr = Iif(Type([tcAddr])=[C], tcAddr, []) && IP地址, 空表示动态获取 
     tcMask = Iif(Type([tcMask])=[C], tcMask, [255.255.255.0]) && 掩码 
     tcGateWay = Iif(Type([tcGateWay])=[C], tcGateWay, [none]) && 网关 
     tcDNS = Iif(Type([tcDNS])=[C], tcDNS, Null) && 主DNS 
     tcAddDNS = Iif(Type([tcAddDNS])=[C], tcAddDNS, Null) && 备用DNS 
     Local lcCmdStr, lcTempFile, lnReturn, lcCR 
     lcCR = Chr(13)+Chr(10) 
     lcTempFile = Addbs(Sys(2023))+[SetIP.tmp] 
     = Strtofile( [interface ip] + lcCR, lcTempFile ) 
     If Empty(tcAddr) 
     * 指定是通过动态主机配置协议 (DHCP) 服务器配置 IP 地址 
     = Strtofile( [set address name="]+tcCard+[" source=dhcp] + lcCR, lcTempFile, 1 ) 
     Else 
     * 使用静态 IP 地址 
     = Strtofile( [set address name="]+tcCard+[" source=static] ; 
     + [ addr=]+tcAddr+[ mask=]+tcMask+[ GateWay=]+tcGateWay+[ gwmetric=1] + lcCR, lcTempFile, 1 ) 
     Endif 
     If !Isnull(tcDNS) 
     * 设置 DNS 
     If Empty(tcDNS) 
     = Strtofile( [set dns name="]+tcCard+[" source=dhcp] + lcCR, lcTempFile, 1 ) 
     Else 
     = Strtofile( [set dns name="]+tcCard+[" source=static addr=]+tcDNS + lcCR, lcTempFile, 1 ) 
     Endif 
     Endif 
     If !Isnull(tcAddDNS) And !Empty(tcAddDNS) 
     * 备用 DNS 
     = Strtofile( [add dns name="]+tcCard+[" addr=]+tcAddDNS+[ index=2] + lcCR, lcTempFile, 1 ) 
     EndIf 
     lcCmdStr = [netsh exec ] + lcTempFile 
     Return ShellAndWait( lcCmdStr, .T., .F. ) > 0 
     Endfunc 
     Function ShellAndWait( tcDosCommand, IsDos, IsShow ) 
     IsDos = Iif(Parameters()>=2 And Type([IsDos])=[L], IsDos, .F.) 
     IsShow = Iif(Parameters()>=3 And Type([IsShow])=[L], IsShow, !IsDos) 
     Local lcCmdStr 
     If IsDos 
     If Empty(Getenv([OS])) 
     lcCmdStr = [Command.com /C ] + tcDosCommand + Chr(0) 
     Else 
     lcCmdStr = [Cmd.exe /C ] + tcDosCommand + Chr(0) 
     Endif 
     Else 
     lcCmdStr = tcDosCommand + Chr(0) 
     Endif 

     #Define NORMAL_PRIORITY_CLASS 32 
     #Define IDLE_PRIORITY_CLASS 64 
     #Define HIGH_PRIORITY_CLASS 128 
     #Define INFINITE -1 
     #Define REALTIME_PRIORITY_CLASS 1600 

     Declare Integer CloseHandle In kernel32 Long hObject 
     Declare Integer WaitForSingleObject In kernel32 Long hHandle, Long dwMilliseconds 
     Declare Integer CreateProcessA In kernel32 ; 
     Long lpApplicationName, ; 
     String lpCommandLine, ; 
     Long lpProcessAttributes, ; 
     Long lpThreadAttributes, ; 
     Long bInheritHandles, ; 
     Long dwCreationFlags, ; 
     Long lpEnvironment, ; 
     Long lpCurrentDirectory, ; 
     String @lpStartupInfo, ; 
     String @lpProcessInformation 

     Local lcStartupInfo, lcProcessInformation, RetCode, hProcess 
     lcStartupInfo = Long2Str(68) + Replicate(Chr(0), 40) + Chr(Iif(IsShow,0,1)) + Replicate(Chr(0), 23) 
     lcProcessInformation = Replicate(Chr(0), 16) 

     RetCode = CreateProcessA(0, lcCmdStr, 0, 0, 1, NORMAL_PRIORITY_CLASS, 0, 0, @lcStartupInfo, @lcProcessInformation ) 
     hProcess = Str2Long(Substr(lcProcessInformation, 1, 4)) 
     RetCode = WaitForSingleObject(hProcess, INFINITE) 
     RetCode = CloseHandle(hProcess) 
     Return RetCode 
     Endfunc 
     
     *----------------------------------------------- 
     Function Long2Str( lnLongVal ) 
     Private i, retustr 
     retustr = [] 
     For i = 24 To 0 Step -8 
     retustr = Chr(Int(lnLongVal/(2^i))) + retustr 
     lnLongVal = Mod(lnLongVal, (2^i)) 
     Next 
     Return retustr 
     Endfunc 
     
     Function Str2Long( tcLongStr ) 
     Private i, RetuVal 
     RetuVal = 0 
     For i = 0 To 24 Step 8 
     RetuVal = RetuVal + (Asc(tcLongStr) * (2^i)) 
     tcLongStr = Right(tcLongStr, Len(tcLongStr) - 1) 
     Next 
     Return RetuVal 
     Endfunc


    IP属地:湖北3楼2008-04-15 22:08
    回复