如果找不到MTU值则新建一个新的MTU值
参考:
(1)、运行regedit   
    
  (2)、浏览到:   
    
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces   
    
    
    
  (3)、Interfaces下有多个子项,每个子项对应一个网卡。请按如下方法选择网卡:   
    
    (a)确定本机用来连接Internet的网卡或拨号连接的IP,如192.168.0.19;   
    
    (b)用鼠标点击Interfaces上的子项,查看键值列表中的IPAddress项;   
    
    (c)如果IPAddress的键值与(a)中的IP相同,即192.168.0.19,则该子项就是要找的网卡。   
    
  (4)、进入该子项,在右边的窗口里按鼠标右键,选择“新建”->“双字节值”,输入名称“MTU”,按回车。再用鼠标双击“MTU”,填入MTU的值。填写前请先把基数设为十进制。 
请问如何实现,哪个有代码贴出来参考下,谢了

解决方案 »

  1.   

    uses
      Registry;var
      RegKey : TRegistry;
    begin
      RegKey := TRegistry.Create;
      RegKey.RootKey := HKEY_LOCAL_MACHINE;
      if RegKey.OpenKey('\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces',True) then
      begin
        RegKey.WriteString('MTU','192.168.0.19');
        RegKey.CloseKey
      end;
        RegKey.Free;
    end;具体的细节,你可以自己加
      

  2.   

    uses
      Registry;var
      RegKey : TRegistry;
    begin
      RegKey := TRegistry.Create;
      RegKey.RootKey := HKEY_LOCAL_MACHINE;
      if RegKey.OpenKey('\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces',True) then
      begin
        RegKey.WriteString('MTU','192.168.0.19');
        RegKey.CloseKey
      end;
        RegKey.Free;
    end;具体的细节,你可以自己加
      

  3.   

    注册表里是没有'192.168.0.19'这个子项的,注册表是这样:
    \SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{98FC92C6-1556-4893-A6A9-8335ABB2099D}
    关健是怎么样通过本地网卡找到这个{98FC92C6-1556-4893-A6A9-8335ABB2099D}才能在它下面进行操作啊
      

  4.   

    你要去循环Interfaces下的子节点,然后和自己网卡作比较,相同即找到
      

  5.   

    procedure SetMtu(IP: String) ;
    type
         TNetTransportEnum = function(pszServer : PWideChar; 
                                      Level : DWORD; 
                                      var pbBuffer : pointer; 
                                      PrefMaxLen : LongInt;
                                      var EntriesRead : DWORD; 
                                      var TotalEntries : DWORD; 
                                      var ResumeHandle : DWORD) : DWORD; stdcall;      TNetApiBufferFree = function(Buffer : pointer) : DWORD; stdcall;      PTransportInfo = ^TTransportInfo;
         TTransportInfo = record
                           quality_of_service : DWORD; 
                           number_of_vcs : DWORD; 
                           transport_name : PWChar; 
                           transport_address : PWChar;
                           wan_ish : boolean; 
                         end; 
    type
      TaPInAddr = array[0..10] of PInAddr;
      PaPInAddr = ^TaPInAddr;
    var
      HostName:   array [0..MAX_PATH] of char;
      NameLen:    Integer;
      WSData:     TWSAData;
      lpHostEnt:  PHostEnt;
      pptr:       PaPInAddr;
    var E,ResumeHandle,
        EntriesRead,
        TotalEntries : DWORD;
        FLibHandle : THandle;
        sMachineName: String;
        pBuffer : pointer;
        pInfo : PTransportInfo;
        FNetTransportEnum : TNetTransportEnum;
        FNetApiBufferFree : TNetApiBufferFree;
        pszServer : array[0..128] of WideChar;
        i : integer;    Reg: TRegistry;
        strGUID: String;
        iPos0,iPos1: Integer;
    begin 
      sMachineName := '\\127.0.0.1';
      // Setup and load from DLL 
      pBuffer := nil; 
      ResumeHandle := 0; 
      FLibHandle := LoadLibrary('NETAPI32.DLL');  // Execute the external function 
      if FLibHandle <> 0 then begin 
        @FNetTransportEnum := GetProcAddress(FLibHandle,'NetWkstaTransportEnum');
        @FNetApiBufferFree := GetProcAddress(FLibHandle,'NetApiBufferFree');
        E := FNetTransportEnum(StringToWideChar(sMachineName,pszServer,129),0,
                               pBuffer,-1,EntriesRead,TotalEntries,Resumehandle);    if E = 0 then begin 
          pInfo := pBuffer; 
          if WSAStartup(MakeWord(2,0), WSData) <> 0 then Exit;
          try
            NameLen := sizeof(HostName);
            fillchar(HostName, NameLen, 0);
            NameLen := GetHostName(HostName, NameLen);
            if NameLen = SOCKET_ERROR then Exit;
            lpHostEnt := GetHostByName(HostName);
            if lpHostEnt = Nil then Exit;
            I := 0;
            pPtr := PaPInAddr(lpHostEnt^.h_addr_list);
            while pPtr^[I] <> nil  do
              begin          // Enumerate all protocols - look for TCPIP
                inc(pInfo); 
                if pos('TCPIP',UpperCase(pInfo^.transport_name)) <> 0 then begin
                  if inet_ntoa(pptr^[I]^) = IP then
                    begin
                      Reg := TRegistry.Create;
                      try
                        Reg.RootKey := HKEY_LOCAL_MACHINE;
                        iPos0 := Pos('{',pInfo^.transport_name);
                        iPos1 := Pos('}',pInfo^.transport_name);
                        strGUID := Copy(pInfo^.transport_name, iPos0 ,iPos1 - iPos0 + 1);
                        if Reg.OpenKey('SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\'+ strGUID,false) then
                          begin
                            if Reg.ValueExists('MTU') then
                              ShowMessage(Format('IP地址:%s的MTU值为%d',[IP,reg.ReadInteger('MTU')]))
                            else begin
                              ShowMessage(Format('IP地址:%s的MTU值未设置!',[IP]));
                              //设置MTU值为1500
                              Reg.WriteInteger('MTU',1500);                        end;
                            Reg.CloseKey;
                          end;
                      finally
                        Reg.Free;
                      end;
                    end;
                end;            
                Inc(I);
              end;
            
          finally
            WSACleanup;
          end;
          if pBuffer <> nil then FNetApiBufferFree(pBuffer);
        end;     try 
          FreeLibrary(FLibHandle); 
        except 
          // 错误处理
        end;
      end;
    end;