如何编程取得注册表的网卡MTU值?

h98458 2009-02-17 03:17:28
如果找不到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的值。填写前请先把基数设为十进制。
请问如何实现,哪个有代码贴出来参考下,谢了
...全文
526 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
a06574 2010-04-23
  • 打赏
  • 举报
回复
怎么我登陆了,还是不能看8楼的?
luntanwujianhua 2009-02-17
  • 打赏
  • 举报
回复
學習
h98458 2009-02-17
  • 打赏
  • 举报
回复
多谢上楼
僵哥 2009-02-17
  • 打赏
  • 举报
回复
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;
gyk120 2009-02-17
  • 打赏
  • 举报
回复
这个……恐怕不好实现,有相关的接口没?
bdmh 2009-02-17
  • 打赏
  • 举报
回复
你要去循环Interfaces下的子节点,然后和自己网卡作比较,相同即找到
h98458 2009-02-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bdmh 的回复:]
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;

具体的细节,你可以自己加
[/Quote]
注册表里是没有'192.168.0.19'这个子项的,注册表是这样:
\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{98FC92C6-1556-4893-A6A9-8335ABB2099D}
关健是怎么样通过本地网卡找到这个{98FC92C6-1556-4893-A6A9-8335ABB2099D}才能在它下面进行操作啊
qkhhxkj102 2009-02-17
  • 打赏
  • 举报
回复
收藏
bdmh 2009-02-17
  • 打赏
  • 举报
回复
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;

具体的细节,你可以自己加
bdmh 2009-02-17
  • 打赏
  • 举报
回复
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;

具体的细节,你可以自己加

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧