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;
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;
连接名称: 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
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;