如何取得网卡的友好名称?

miky 2007-03-16 12:17:38
使用iphlpapi.dll里的Getinterfaceinfo可以取得网卡的设备名和设备描述,但这个设备名称只是个GUID, 怎么才能取得像"本地连接"这样的设备友好名?
最好不用读注册表。
...全文
861 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
kongfancheng 2007-03-26
  • 打赏
  • 举报
回复
LMD有相关的控件。
dovelee 2007-03-23
  • 打赏
  • 举报
回复
收藏
zzd8310 2007-03-22
  • 打赏
  • 举报
回复
老妖好人啊
miky 2007-03-17
  • 打赏
  • 举报
回复
在我的电脑上报AV错误
系统是XP sp2,D7 由于是笔记本, 关了不少我认为不需要的服务, 不知道你这个是不是要依赖什么服务?

CoCreateInstance(CLSID_ConnectionManager, nil, CLSCTX_SERVER,
IID_INetConnectionManager, pManager);
应该是这句没有正确地取得pManager;
在if SUCCEEDED(pManager.EnumConnections(NCME_DEFAULT, pEnum)) then报AV错。



ccrun.com 2007-03-17
  • 打赏
  • 举报
回复
转载一份:

(******************************************************************************
* CopyRight (c) By 姚佩云 2004
* All Right Reserved
* Email : i_rock_1001@163.com www.jynx.com.cn
* Date :
* New Develop : 2004-4-8
* Description :
* 这是一个禁用、启用网卡的例子,实际上通过shell可以控制整个界面,参考的网上资料
* 需要先引用 Microsoft Shell Controls And Automation(Shell32.dll)对应delphi声明 Shell32_TLB.pas
* Export :
* GetNetLinkList
* ExcNetLinkMenu
* 首发大富翁(www.delphibbs.com)blog,转载请保留
******************************************************************************)

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,Shell32_TLB, StdCtrls, Menus;

type
TForm1 = class(TForm)
Button1: TButton;
ComboBox1: TComboBox;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;

implementation

{$R *.dfm}


{++

Routine Description:

取本机所有网络链接列表

Arguments:

OUT list - 取得的网络链接列表

Return Value:

BOOLEAN - 执行是否成功

--}

function GetNetLinkList(var list:TStrings):BOOLEAN;
var
Shell:TShell;
ControlPanel:Folder;
Item:FolderItem;
i:integer;
begin

Result:= FALSE;
if list = nil then
exit;

Shell:=TShell.Create(Application);
if Shell = nil then
exit;

ControlPanel:=Shell.NameSpace(ssfCONTROLS);
for i:=0 to ControlPanel.items.Count -1 do
begin
Item:=ControlPanel.items.Item(i);
if (Item.Name = '网络和拨号连接') then //如果是英文的windows则Name也需是英文的
begin
ControlPanel:=Folder(Item.GetFolder);
break;
end;
end;

for i:=0 to ControlPanel.items.count-1 do
begin
Item:= ControlPanel.items.Item(i);
List.Add(Item.Name);
end;
FreeAndNil(shell);

Result:= TRUE;
end;


{++

Routine Description:

执行 本地网络链接 的菜单命令(包括禁用、启用)

Arguments:

IN AdapterName - 网络链接名称
IN MenuName - 菜单名称

Return Value:

BOOLEAN - 执行是否成功

--}

function ExcNetLinkMenu(const AdapterName,MenuName:String):BOOLEAN;
var
Shell:TShell;
ControlPanel:Folder;
Item:FolderItem;
i,j:integer;
Verb:FolderItemVerb;
begin

Result:= FALSE;

Shell:=TShell.Create(Application);
if Shell = nil then
exit;

ControlPanel:=Shell.NameSpace(ssfCONTROLS);
for i:=0 to ControlPanel.items.Count -1 do
begin
Item:=ControlPanel.items.Item(i);
if (Item.Name = '网络和拨号连接') then //如果是英文的windows则Name也需是英文的
begin
ControlPanel:=Folder(Item.GetFolder);
break;
end;
end;

for i:=0 to ControlPanel.items.count-1 do
begin
Item:=ControlPanel.items.Item(i);
if (Item.Name = AdapterName) then //如果是英文的windows则Name也需是英文的
begin
for j:=0 to Item.Verbs.Count -1 do
begin
Verb:=Item.Verbs.Item(j);
if (Verb.Name = MenuName) then
begin
Verb.DoIt ;
Result:=TRUE;
break;
end;
end;
break;
end;
end;

FreeAndNil(shell);

end;


procedure TForm1.Button1Click(Sender: TObject);
var
list:TStrings;
begin
List:=TStringList.Create ;
GetNetLinkList(List);
ComboBox1.Items:=List;
FreeAndNil(List);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ExcNetLinkMenu('本地连接 2','启用(&A)');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ExcNetLinkMenu('本地连接 2','禁用(&B)');
end;

end.
amdwinter 2007-03-17
  • 打赏
  • 举报
回复
jf
ahjoe 2007-03-17
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Registry, StdCtrls;

const
MAX_ADAPTER_NAME_LENGTH = 256;
MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
MAX_ADAPTER_ADDRESS_LENGTH = 8;

type
TIP_ADDRESS_STRING = record
IPstring: array [0..15] of Char;
end;
PIP_ADDRESS_STRING = ^TIP_ADDRESS_STRING;
TIP_MASK_STRING = TIP_ADDRESS_STRING;
PIP_MASK_STRING = ^TIP_MASK_STRING;

PIP_ADDR_STRING = ^TIP_ADDR_STRING;
TIP_ADDR_STRING = record
Next: PIP_ADDR_STRING;
IpAddress: TIP_ADDRESS_STRING; //IP地址字符串
IpMask: TIP_MASK_STRING; //子网掩码字符串
Context: DWORD; //Netword table entry
end;
PIP_ADAPTER_INFO = ^TIP_ADAPTER_INFO;
TIP_ADAPTER_INFO = packed record
Next: PIP_ADAPTER_INFO;
ComboIndex: DWORD;
AdapterName: array [0..MAX_ADAPTER_NAME_LENGTH + 4-1] of Char;
Description: array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 4-1] of Char;
AddressLength: UINT;
Address: array [0..MAX_ADAPTER_ADDRESS_LENGTH-1] of BYTE;
Index: DWORD;
dwType: UINT;
DhcpEnabled: UINT;
CurrentIpAddress: PIP_ADDR_STRING;
IpAddressList: TIP_ADDR_STRING;
GatewayList: TIP_ADDR_STRING;
DhcpServer: TIP_ADDR_STRING ;
HaveWins: BOOL;
PrimaryWinsServer: TIP_ADDR_STRING;
SecondaryWinsServer: TIP_ADDR_STRING;
end;

type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
function SearchNetwork(): string;
public
{ Public declarations }
end;

var
Form1: TForm1;

function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO;
pOutBufLen: PDWORD): DWORD; stdcall;
external 'IPHLPAPI.DLL' name 'GetAdaptersInfo';

implementation

{$R *.DFM}

function ExtractRegKey(var Path: string): string; // return key
var
i: integer;
begin
i := Pos('\', Path);
if i > 1 then
begin
Result := Copy(Path, 1, i-1);
Delete(Path, 1, i);
end
else
begin
Result := Path;
Path := '';
end;

end;

Function ReadRegStrValue(Path: string; DataName: String): string;
var
regfile: TRegistry;
tstr: string;
begin
Result := '';
regfile := TRegistry.Create();
try
tstr := UpperCase(ExtractRegKey(Path));
if tstr = 'HKEY_CLASSES_ROOT' then
regfile.RootKey := HKEY_CLASSES_ROOT
else if tstr = 'HKEY_CURRENT_USER' then
regfile.RootKey := HKEY_CURRENT_USER
else if tstr = 'HKEY_LOCAL_MACHINE' then
regfile.RootKey := HKEY_LOCAL_MACHINE
else if tstr = 'HKEY_CURRENT_CONFIG' then
regfile.RootKey := HKEY_CURRENT_CONFIG
else if tstr = 'HKEY_DYN_DATA' then
regfile.RootKey := HKEY_DYN_DATA;

while Path <> '' do
begin
tstr := ExtractRegKey(Path);
if not regfile.OpenKey(tstr, False) then
Exit
end;
Result := regfile.ReadString(DataName);
finally
regfile.Free;
end;
end;

function TForm1.SearchNetwork(): string;
var
pbuf: PIP_ADAPTER_INFO;
buflen: DWORD;
i: integer;
guid: string;
regfolder: string;
linkname: string;
mac: string;
begin
Result := '';
buflen := 0;
if GetAdaptersInfo(pbuf, @bufLen) = ERROR_BUFFER_OVERFLOW then
begin
pbuf := AllocMem(buflen);
if GetAdaptersInfo(pbuf, @bufLen) = ERROR_SUCCESS then
while pbuf <> nil do // 找到一个网络连接
begin
// pbuf 指向连接信息
// 此处加入处理代码
guid := StrPas(pbuf.AdapterName);
regfolder := 'HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\' + guid + '\Connection';
linkname := ReadRegStrValue(regfolder, 'name');
Memo1.Lines.Add(linkname);
Memo1.Lines.Add('IP: ' + pbuf.IpAddressList.IpAddress.IPstring);
Memo1.Lines.Add('MASK: ' + pbuf.IpAddressList.IpMask.IPstring);
Memo1.Lines.Add('Gateway: ' + pbuf.GatewayList.IpAddress.IPstring);
mac := '';
for i := 0 to 5 do
mac := mac + IntToHex(pbuf.Address[i], 2);
Memo1.Lines.Add('MAC: ' + mac);
Memo1.Lines.Add('');
pbuf := pbuf.Next;
end;
FreeMem(pbuf);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SearchNetwork();
end;

end.
ccrun.com 2007-03-16
  • 打赏
  • 举报
回复
以上代码在WinXP SP2 + Delphi7上调试成功。运行后获取到类似以下内容:

连接名称: RTL8139, 设备名称: Realtek RTL8139 Family PCI Fast Ethernet NIC
连接名称: vNet1, 设备名称: VMware Virtual Ethernet Adapter for VMnet1
连接名称: vNet8, 设备名称: VMware Virtual Ethernet Adapter for VMnet8
连接名称: ADSL, 设备名称: USB ADSL LAN Adapter
ccrun.com 2007-03-16
  • 打赏
  • 举报
回复
我来了!!!实在不好意思,下午有事忙了一会给忘了,睡觉前想起来,赶紧调试了一会代码。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ActiveX;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

const
CLSID_ConnectionManager: TGUID = '{BA126AD1-2166-11D1-B1D0-00805FC1270E}';
IID_INetConnectionManager: TGUID = '{C08956A2-1CD3-11D1-B1C5-00805FC1270E}';

type

NETCONMGR_ENUM_FLAGS = (NCME_DEFAULT);
NETCON_STATUS = (
NCS_DISCONNECTED,
NCS_CONNECTING,
NCS_CONNECTED,
NCS_DISCONNECTING,
NCS_HARDWARE_NOT_PRESENT,
NCS_HARDWARE_DISABLED,
NCS_HARDWARE_MALFUNCTION,
NCS_MEDIA_DISCONNECTED,
NCS_AUTHENTICATING,
NCS_AUTHENTICATION_SUCCEEDED,
NCS_AUTHENTICATION_FAILED,
NCS_INVALID_ADDRESS,
NCS_CREDENTIALS_REQUIRED
);
NETCON_MEDIATYPE = (
NCM_NONE,
NCM_DIRECT,
NCM_ISDN,
NCM_LAN,
NCM_PHONE,
NCM_TUNNEL,
NCM_PPPOE,
NCM_BRIDGE,
NCM_SHAREDACCESSHOST_LAN,
NCM_SHAREDACCESSHOST_RAS
);
PNETCON_PROPERTIES = ^NETCON_PROPERTIES;
NETCON_PROPERTIES = record
guidId: TGuid;
pszwName: LPWSTR; // rray [0..255] of WCHAR;
pszwDeviceName: LPWSTR;
Status: NETCON_STATUS;
MediaType: NETCON_MEDIATYPE;
dwCharacter: DWORD;
clsidThisObject: TGuid;
clsidUiObject: TGuid;
end;

INetConnectionManager = interface;
INetConnection = interface;
IEnumNetConnection = interface;

INetConnectionManager = interface(IUnknown)
['{C08956A2-1CD3-11D1-B1C5-00805FC1270E}']
function EnumConnections(flag: NETCONMGR_ENUM_FLAGS; out ppv: IEnumNetConnection): HRESULT; stdcall;
end;

IEnumNetConnection = interface(IUnknown)
['{C08956A0-1CD3-11D1-B1C5-00805FC1270E}']
function Next(celt: DWORD; out rgelt: INetConnection; pceltFetched: PULONG): HRESULT; stdcall;
function Skip(celt: ULONG): HRESULT; stdcall;
function Reset(): HRESULT; stdcall;
function Clone(out ppenum: IEnumNetConnection): HRESULT; stdcall;
end;

INetConnection = interface(IUnknown)
['{C08956A1-1CD3-11D1-B1C5-00805FC1270E}']
function Connect(): HRESULT; stdcall;
function Disconnect(): HRESULT; stdcall;
function Delete(): HRESULT; stdcall;
function Duplicate(pszwDuplicateName: LPCWSTR; out ppCon: INetConnection): HRESULT; stdcall;
function GetProperties(out ppProps: PNETCON_PROPERTIES): HRESULT; stdcall;
function GetUiObjectClassId(out pclsid: TGUID): HRESULT; stdcall;
function Rename(pszwNewName: LPCWSTR): HRESULT; stdcall;
end;

implementation

{$R *.dfm}

//---------------------------------------------------------------------------
procedure CrnGetConnection(pList: TStrings);
var
pManager: INetConnectionManager;
pEnum: IEnumNetConnection;
pConnection: INetConnection;
celtFetched: DWORD;
pProperties: PNETCON_PROPERTIES;
begin
CoCreateInstance(CLSID_ConnectionManager, nil, CLSCTX_SERVER,
IID_INetConnectionManager, pManager);
if SUCCEEDED(pManager.EnumConnections(NCME_DEFAULT, pEnum)) then
begin
while(pEnum.Next(1, pConnection, @celtFetched) = S_OK) do
begin
pConnection.GetProperties(pProperties);

pList.Add(Format('连接名称: %s, 设备名称: %s',
[pProperties.pszwName, pProperties.pszwDeviceName]));
end;
end;
end;
//---------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
CrnGetConnection(Memo1.Lines);
end;
//---------------------------------------------------------------------------
procedure TForm1.FormDestroy(Sender: TObject);
begin
CoUninitialize;
end;
//---------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
CoInitialize(nil);
end;

end.
日总是我哥 2007-03-16
  • 打赏
  • 举报
回复
看看注册表的这个目录下面的内容,是不是你要的。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\

CSDN论坛浏览器:浏览、发帖、回复、结贴自动平均给分,下载地址:http://CoolSlob.ys168.com
日总是我哥 2007-03-16
  • 打赏
  • 举报
回复
老幺,楼主等好久了:)

CSDN论坛浏览器:浏览、发帖、回复、结贴自动平均给分,下载地址:http://CoolSlob.ys168.com
ccrun.com 2007-03-16
  • 打赏
  • 举报
回复
稍等,我把我的C++代码给你翻译一份。
miky 2007-03-16
  • 打赏
  • 举报
回复
那怎么取得连接的名称呢?
ccrun.com 2007-03-16
  • 打赏
  • 举报
回复
类似"本地连接"这样的字符串是连接的名称,不是网卡的名称,网卡的友好名称应该就是那个设备描述的字符串。
件简介: IPHelper是一款帮助您快速设置IP地址、网关、DNS及IE代理服务器等相关设置的绿色免费软件, 特别适合移动办公用户和需要经常在不同网段间切换的用户使用。作者最早开发此软件时是为了满足 自身的更改IP的需要,随后在网络上众多用户给予了肯定、支持和帮助,4年多来IPHelper经过的不断 改进,操作更加便利,功能不断完善,希望它能给更多的用户带来便利! 更新日志: IPHelper5.2 - 增加了修改计算机名称及执行自定义命令等功能。修正了部分bug,增进界面友好性。(2008/12) IPHelper4.6 - 增加了“生成快捷方式”功能,大大提高了部分常用配置的切换速度。软件可以 最小化到任务栏,并快速切换配置。修正了部分bug,增进界面友好性。(2007/01) IPHelper4.2 - 改用xml配置文件存放历史配置;增加多IP多DNS设置;增加IE代理服务器设置; 增强了操作性。(2006/07) IPHelper3.5 - 增加网络连通情况测试。调整了界面结构,增加界面友好性。(2005/03) IPHelper3.3 - 增加了自动备份功能;增加了小图标显示功能(右键菜单内选择);修正了多 DNS会自动退出的Bug。(2004/11) IPHelper3.1 - 加强了界面友好度,可以更改配置名称。添加了DNS修改功能。(2004/03) IPHelper2.6 - 加强了对多网卡的支持,对性能进行了优化,添加了新版本提示功能。(2003/08) IPHelper2.1 - 第一个发布版本,小巧实用的特性得到了网友们的肯定。(2002/11) 联系方式: Web: http://www.4w5w.com/soft/ E-Mail: www@4w5w.com

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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