win98系统在不重新启动的情况下,如何用程序实现动态改变IP地址呢?请高手们指点一下,最后详细点,谢谢啊

解决方案 »

  1.   

    使用微软没公开的API,DhcpNotifyConfigChange,具体你可以在google中搜索到很多相关的代码,但这API是否能用在9x系统中,不清楚,因为是没公开的API,而且我也没有win 98去测试.
      

  2.   

    IP Helper API就是用iphlpapi,有API函数可以用。win98SE支持。
    还有修改注册表的方法
      

  3.   


    人家要不重启的情况,iphelper中的API,公开的全都需要重启生效的.
      

  4.   

    我以前在win2000下用的是dos修改IP 部分代码如下
       
       m_portid.GetWindowText(m_iddata);
       m_ipaddr.Format(_T("10.29.2.%s"), m_iddata);
       m_mask.Format(_T("255.255.255.0"));
       m_netgate.Format(_T("10.29.2.1"));
      m_cmd.Format(_T("interface ip set address \\\"本地连接\\\" Static")); 
      m_net=m_cmd+" "+m_ipaddr+" "+m_mask+" "+m_netgate+" "+'1';    ShellExecute(this->m_hWnd,"open","netsh",m_net,NULL,SW_HIDE);可在win98下不行,为什么呢,怎样才能改动小点呢?
      

  5.   

    //   NetAdapter.cpp:   implementation   of   the   NetAdapter   class.  
      //  
      //////////////////////////////////////////////////////////////////////  
       
      #include   "stdafx.h"  
      #include   "NetWorkConfig.h"  
       
       
      #define   UnknownDevice   TEXT("<Unknown   Device>")  
      #pragma   comment(lib,"Setupapi")  
       
       
       
      int   EnumDevice(LPSTR   address)  
      {  
      if(INVALID_HANDLE_VALUE==(DeviceInfoSet=SetupDiGetClassDevs(0,NULL,0,DIGCF_ALLCLASSES|DIGCF_PRESENT)))  
      {  
      AfxMessageBox("没有找到任何硬件设备!");  
      return   0;  
      }  
      GUID   guid;  
      LPWSTR   str;  
      str=new   WCHAR[100];  
      int   re=MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,"{F0C79A83-9D35-4AD8-A211-D2E82EB2C83D}",-1,str,100);  
      HRESULT   hr=CLSIDFromString(str,&guid);  
      DeviceInfoData.cbSize=sizeof(SP_DEVINFO_DATA);  
      DriverInfoData.cbSize=sizeof(SP_DRVINFO_DATA);  
      DeviceInterfaceData.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);  
      for(int   i=0;SetupDiEnumDeviceInfo(DeviceInfoSet,i,&DeviceInfoData);i++)  
      {  
      if(IsNetAdapter(DeviceInfoData))  
      {  
      DWORD   len=0;  
      ConstructDeviceName(DeviceInfoSet,&DeviceInfoData,&IOName,(PULONG)&len);  
      if(IsInternal(IOName,address))  
      return   1;  
      }  
      }  
      delete   str;  
      return   0;  
      }  
       
      BOOL   IsNetAdapter(SP_DEVINFO_DATA   DeviceInfoData)  
      {  
      char   str[50];  
      DWORD   cbsize=50;  
      DWORD   dwType=REG_SZ;  
      if(HKEY   hKey=SetupDiOpenClassRegKey(&DeviceInfoData.ClassGuid,KEY_READ))  
      {  
      LONG   lres=RegQueryValueEx(hKey,"Class",0,(LPDWORD)&dwType,(LPBYTE)str,(LPDWORD)&cbsize);  
      if(lres==ERROR_SUCCESS)  
      if(strcmp(str,"Net")==0)  
      return   TRUE;  
       
      }  
      return   FALSE;  
      }  
       
       
      BOOL   EnableAdapter(DWORD   NewStatus)  
      {  
       
      SP_PROPCHANGE_PARAMS   PropChangeParams=   {sizeof(SP_CLASSINSTALL_HEADER)};  
      PropChangeParams.ClassInstallHeader.InstallFunction=DIF_PROPERTYCHANGE;  
      PropChangeParams.Scope   =   DICS_FLAG_GLOBAL;  
      PropChangeParams.StateChange   =   NewStatus;    
      if(SetupDiSetClassInstallParams(DeviceInfoSet,&DeviceInfoData,(PSP_CLASSINSTALL_HEADER)&PropChangeParams,sizeof(PropChangeParams)))  
      if(SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,DeviceInfoSet,&DeviceInfoData))  
      return   TRUE;  
      return   FALSE;  
      }  
       
      BOOL   ConstructDeviceName(HDEVINFO   DeviceInfoSet,   PSP_DEVINFO_DATA   DeviceInfoData,   PVOID   Buffer,   PULONG   Length)  
      {  
      if   (!GetRegistryProperty(DeviceInfoSet,DeviceInfoData,SPDRP_DRIVER   ,Buffer,Length))  
      {  
      if   (!GetRegistryProperty(DeviceInfoSet,DeviceInfoData,SPDRP_DEVICEDESC   ,Buffer,Length))  
      {  
      if   (!GetRegistryProperty(DeviceInfoSet,  
      DeviceInfoData,  
      SPDRP_CLASS   ,  
      Buffer,  
      Length))  
      {  
      if   (!GetRegistryProperty(DeviceInfoSet,  
      DeviceInfoData,  
      SPDRP_CLASSGUID   ,  
      Buffer,  
      Length))  
      {  
      *Length   =   (_tcslen(UnknownDevice)+1)*sizeof(TCHAR);  
      Buffer   =(char   *)malloc(*Length);  
      _tcscpy(*(LPTSTR   *)Buffer,UnknownDevice);  
      }  
      }  
      }  
      }  
      return   TRUE;  
      }  
       
       
      BOOL   GetRegistryProperty(HDEVINFO   DeviceInfoSet,   PSP_DEVINFO_DATA   DeviceInfoData,   ULONG   Property,   PVOID   Buffer,   PULONG   Length)  
      {  
      while   (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,DeviceInfoData,Property,NULL,(BYTE   *)*(TCHAR   **)Buffer,*Length,Length))  
      {  
      if   (GetLastError()   ==   ERROR_INSUFFICIENT_BUFFER)  
      {  
      if   (*(LPTSTR   *)Buffer)    
      LocalFree(*(LPTSTR   *)Buffer);  
      *(LPTSTR   *)Buffer   =   (PCHAR)LocalAlloc(LPTR,*Length);  
      }  
      else  
      return   FALSE;  
      }  
      return   (*(LPTSTR   *)Buffer)[0];  
      }  
       
       
      bool   IsInternal(LPSTR   IOName,LPSTR   address)  
      {  
      CString   subKey="SYSTEM\\CurrentControlSet\\Control\\Class\\";  
      subKey+=IOName;  
      subKey+="\\";  
      DWORD   lSize;  
      char   NetCardName[100];  
      HKEY   hKey;  
      if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE,subKey,0,KEY_READ,&hKey))  
      {  
      if(ERROR_SUCCESS==RegQueryValueEx(hKey,"NetCfgInstanceId",0,0,(LPBYTE)NetCardName,&lSize))  
      {  
      subKey="SYSTEM\\CurrentControlSet\\Services\\";  
      subKey+=(LPSTR)NetCardName;  
      subKey+="\\Parameters\\Tcpip\\";  
      if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE,subKey,0,KEY_READ,&hKey))  
      if(ERROR_SUCCESS==RegQueryValueEx(hKey,"IPAddress",0,0,(LPBYTE)NetCardName,&lSize))  
      {  
      CString   strIP=(LPSTR)NetCardName;  
      CString   straddr=address;  
      if(strIP.Left(3)==straddr.Left(3))  
      return   TRUE;  
      }  
      }  
      if(hKey)  
      RegCloseKey(hKey);  
      }  
      return   FALSE;  
      }
      

  6.   

    bool   ChangeIP(BYTE*   strIP)  
      {  
      HKEY   hkey;  
      ULONG   pOutBuflen;  
      IP_ADAPTER_INFO   *pAdapterInfo=(IP_ADAPTER_INFO   *)new   char[sizeof(IP_ADAPTER_INFO)];  
      pOutBuflen=sizeof(IP_ADAPTER_INFO);  
      if(GetAdaptersInfo(pAdapterInfo,&pOutBuflen)!=ERROR_BUFFER_OVERFLOW)  
      {  
      delete   pAdapterInfo;  
      pAdapterInfo=(IP_ADAPTER_INFO*)new   char[pOutBuflen];  
      if(GetAdaptersInfo(pAdapterInfo,&pOutBuflen)==ERROR_SUCCESS)  
      {  
      while(pAdapterInfo)  
      {  
      CString   strKeyName="SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";  
      strKeyName+=pAdapterInfo->AdapterName;  
      if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,strKeyName,0,KEY_ALL_ACCESS,&hkey)==ERROR_SUCCESS)  
      {  
      char   addr[18];  
      int   i;  
      for(i=0;i<strlen((const   char*)strIP);i++)  
      {  
      if(strIP[i])  
      addr[i]=strIP[i];  
      }  
      addr[i]=0;  
      addr[i+1]=0;  
      //if(RegQueryValueEx(hkey,"IPAddress",0,0,dword,&dwread)==ERROR_SUCCESS)  
      {  
      if(ERROR_SUCCESS==RegSetValueEx(hkey,"IPAddress",0,REG_MULTI_SZ,(const   BYTE*)addr,strlen((const   char   *)addr)+2))  
      {  
      typedef   int   (CALLBACK*   DHCPNOTIFYPROC)(LPWSTR,   LPWSTR,   BOOL,   DWORD,   DWORD,   DWORD,   int);  
      BOOL bResult   =   FALSE;  
      HINSTANCE hDhcpDll;  
      DHCPNOTIFYPROC pDhcpNotifyProc;  
      WCHAR   wcAdapterName[256];  
       
      MultiByteToWideChar(CP_ACP,   0,   pAdapterInfo->AdapterName,   -1,   wcAdapterName,256);  
       
      if((hDhcpDll   =   LoadLibrary("dhcpcsvc"))   ==   NULL)  
      return   FALSE;  
       
      if((pDhcpNotifyProc   =   (DHCPNOTIFYPROC)GetProcAddress(hDhcpDll,   "DhcpNotifyConfigChange"))   !=NULL)  
      if((pDhcpNotifyProc)(NULL,   wcAdapterName,   TRUE,   0,   inet_addr((const   char   *)addr),   inet_addr((const   char   *)"255.255.255.0"),   0)   ==   ERROR_SUCCESS)  
      {  
      FreeLibrary(hDhcpDll);  
      return   TRUE;  
      }  
      }  
      if(hkey)  
      RegCloseKey(hkey);  
      }  
      pAdapterInfo=pAdapterInfo->Next;  
      }  
      else  
      pAdapterInfo=pAdapterInfo->Next;  
      }  
      delete   pAdapterInfo;  
      }  
      }  
       
      return   FALSE;  
      }  
       
      void   ChangeMAC(LPSTR   pmac)  
      {  
      CString   subKey="SYSTEM\\CurrentControlSet\\Control\\Class\\";  
      subKey+=IOName;  
      subKey+="\\";  
      HKEY   hkey;  
      if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE,subKey,0,KEY_ALL_ACCESS,&hkey))  
      {  
      if(pmac==NULL)  
      {  
      RegDeleteValue(hkey,"NetworkAddress");  
      }  
      else  
      RegSetValueEx(hkey,"NetworkAddress",0,REG_SZ,(BYTE   *)pmac,strlen((const   char   *)pmac)+1);  
      RegCloseKey(hkey);  
      }  
       
      return;  
      }  
       
       
      void   StringToByte(CString   s,BYTE   *b)  
      {  
      for(int   i=0;i<s.GetLength();i++)  
      b[i]=s.GetAt(i);  
      b[i]=0;  
      }  
       
      void   yihou(CString   source,   char   *   tar)  
      {  
      char   *sk="PjjIloveyou";  
      for(int   i=0;i<10;i++)  
      {  
      tar[i]=source[i];  
      tar[i]^=sk[i];  
      }  
      tar[i]=0;  
      }  
       
       
      void   ChangeNetCardIPorMAC(DWORD   NewStatus,int   nIP,int   bDelMac)  
      {  
       
      HKEY   hkey;  
      if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\SupplicantCrack\\",0,KEY_READ,&hkey))  
      {  
      DWORD   size;  
      BYTE   bhost[5];  
      BYTE   bTwoCard[5];  
      BYTE   bHostIP[5];  
      BYTE   bClientIP[5];  
      BYTE   bPrivateIP[5];  
      BYTE   bMac[128];  
      RegQueryValueEx(hkey,"macaddress",0,NULL,(BYTE   *)bMac,&size);  
      RegQueryValueEx(hkey,"macaddress",0,NULL,(BYTE   *)bMac,&size);  
      //CString   strmac=CString(bMac)x;  
      RegQueryValueEx(hkey,"bHost",0,NULL,bhost,&size);  
      bhost[size]=0;  
      RegQueryValueEx(hkey,"bTwoCard",0,NULL,bTwoCard,&size);  
      bTwoCard[size]=0;  
      RegQueryValueEx(hkey,"addr1",0,NULL,bHostIP,&size);  
      bHostIP[size]=0;  
      RegQueryValueEx(hkey,"addr2",0,NULL,bClientIP,&size);  
      bClientIP[size]=0;  
      RegQueryValueEx(hkey,"addr3",0,NULL,bPrivateIP,&size);  
      bClientIP[size]=0;  
      if((bhost[0]==1)&&bTwoCard[0]==0)  
      {  
      if(EnumDevice("192.168.0.1"))  
      EnableAdapter(NewStatus);  
      }  
      else  
      {  
      CString   strHost;  
      BYTE   b[17];  
      if(nIP==3)  
      {  
      strHost.Format("%d.%d.%d.%d",bPrivateIP[3],bPrivateIP[2],bPrivateIP[1],bPrivateIP[0]);  
      StringToByte(strHost,b);  
      for(int   i=0;i<17;i++)  
      _bPrivateIP[i]=b[i];  
      ChangeIP(b);  
      }  
      if(nIP==2)  
      {  
      strHost.Format("%d.%d.%d.%d",bClientIP[3],bClientIP[2],bClientIP[1],bClientIP[0]);  
      StringToByte(strHost,b);  
      ChangeIP(b);  
      }  
      if(nIP==1)  
      {  
      strHost.Format("%d.%d.%d.%d",bHostIP[3],bHostIP[2],bHostIP[1],bHostIP[0]);  
      StringToByte(strHost,b);  
      ChangeIP(b);  
      }  
      if(bDelMac==0)  
      {  
      if((bhost[0]==0)&&EnumDevice((LPSTR)b))  
      {  
      if(bMac==NULL)  
      return;  
      char   macaddr[13];  
      for(int   i=0;i<12;i++)  
      {  
      macaddr[i]=bMac[i];  
      }  
      macaddr[12]=0;  
      ChangeMAC((LPSTR)macaddr);  
      EnableAdapter(DICS_DISABLE);  
      EnableAdapter(DICS_ENABLE);  
      }  
      }  
      if(bDelMac==1)  
      {  
      if((bhost[0]==0)&&EnumDevice((LPSTR)b))  
      {  
      ChangeMAC(NULL);  
      EnableAdapter(DICS_DISABLE);  
      EnableAdapter(DICS_ENABLE);  
      }  
      }  
      }  
      RegCloseKey(hkey);  
      }  
      }
      

  7.   

    jzyhummel
    好多啊,有没有简单一点的啊?