电脑上安装有多个网卡,请问如何获取它们的ip地址和对应的MAC地址,谢谢!
解决方案 »
- Dll子窗体问题
- delphi中 for 语句有没有类试于vb中step的步长?
- 有关OPENDIALOG访问服务器磁盘的问题
- 提供ERP系統,考勤系統,門禁系統等
- publish的含义是什么啊和public有什么区别啊
- delphi2009 取oracle数据库中gb18030编码汉字问题
- 请问各位高手,怎样才能在线程当中完全释放掉Excel!
- 谁有Delphi属性编辑器的源代码?仿照的也可以,只要能实现大概模样就行
- 菜鸟请问大侠个问题:在image控件里画线,每画一条,就存入数据库,以后再次打开这个程序时就从数据库读取信息来显示线的条数和位置,如
- 真是搞不懂
- 怎样编写一个死循环
- 请教大家一个串口通信问题。
http://hi.baidu.com/%CD%F8%B3%E6%D0%EC/blog/item/73b8340fe2a4fccd7bcbe19f.html
参考
function GetLocalIpList(var IpList:TStringList):Integer;
type
TaPInAddr = array[0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
HostName: array [0..MAX_PATH] of char;
NameLen: Integer;
WSData: TWSAData;
lpHostEnt: PHostEnt;
I: Integer;
pptr: PaPInAddr;
begin
Result := 0;
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);
IpList.Clear;
while pPtr^[I] <> nil do
begin
IpList.ADD( inet_ntoa(pptr^[I]^));
Inc(I);
end;
Result := IpList.Count;
finally
WSACleanup;
end;
end;
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; var E,ResumeHandle,
EntriesRead,
TotalEntries : DWORD;
FLibHandle : THandle;
sMachineName,
sMacAddr,
Retvar : string;
pBuffer : pointer;
pInfo : PTransportInfo;
FNetTransportEnum : TNetTransportEnum;
FNetApiBufferFree : TNetApiBufferFree;
pszServer : array[0..128] of WideChar;
i,ii,iIdx : integer;
begin
sMachineName := trim(AServerName);
Retvar := '00-00-00-00-00-00'; // Add leading \\ if missing
if (sMachineName <> '') and (length(sMachineName) >= 2) then begin
if copy(sMachineName,1,2) <> '\\' then
sMachineName := '\\' + sMachineName
end; // 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; // Enumerate all protocols - look for TCPIP
for i := 1 to EntriesRead do begin
if pos('TCPIP',UpperCase(pInfo^.transport_name)) <> 0 then begin
// Got It - now format result xx-xx-xx-xx-xx-xx
iIdx := 1;
sMacAddr := pInfo^.transport_address; for ii := 1 to 12 do begin
Retvar[iIdx] := sMacAddr[ii];
inc(iIdx);
if iIdx in [3,6,9,12,15] then inc(iIdx);
end;
end; inc(pInfo);
end;
if pBuffer <> nil then FNetApiBufferFree(pBuffer);
end; try
FreeLibrary(FLibHandle);
except
// 错误处理
end;
end;
result:=Retvar;
end;
Next: PIP_ADAPTER_INFO;
ComboIndex: DWORD;
AdapterName: array[1..MAX_ADAPTER_NAME_LENGTH + 4] of char;
Deforbiddenion: array[1..MAX_ADAPTER_DEforbiddenION_LENGTH + 4] of char;
AddressLength: UINT;
Address: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte;
Index: DWORD;
aType: UINT;
DHCPEnabled: UINT;
CurrentIPAddress: PIP_ADDR_STRING;
IPAddressList: IP_ADDR_STRING;
GatewayList: IP_ADDR_STRING;
DHCPServer: IP_ADDR_STRING;
HaveWINS: BOOL;
PrimaryWINSServer: IP_ADDR_STRING;
SecondaryWINSServer: IP_ADDR_STRING;
LeaseObtained: LongInt;
LeaseExpires: LongInt;
end;const
AddrLen = 6;
var
PAdapterInfo: PIP_ADAPTER_INFO;
ret: DWORD;
i: integer;
Next: PIP_ADAPTER_INFO;
sMAC: string;
OutBufLen: ULONG;
begin
GetAdaptersInfo(nil, @OutBufLen); // to get the required size
// alloc memory size = OutBufLen
PAdapterInfo := AllocMem(OutBufLen);
ret:= GetAdaptersInfo(PAdapterInfo, @OutBufLen);
if ret = 0 then
begin
Next:= PAdapterInfo;
repeat
Memo1.Lines.Add('Deforbiddenion: '+ Next^.Deforbiddenion);
sMAC := 'MAC address: ';
for i := 0 to AddrLen do
begin
sMAC := sMAC + IntToHex(Next^.Address[i], 2);
if i <> AddrLen then
sMAC := sMAC + '-';
end;
Memo1.Lines.Add(sMAC);
Next:= Next^.Next;
until Next = nil;
end; FreeMem(PAdapterInfo, OutBufLen);end;
其实我有更简单的获取ip地址方法:
uses IdStack;
var
allip:string;
allip :=GStack.LocalAddresses.text;而且获取mac的方法跟bdmh网友的方法相同,
就是不知道如何把它们对应起来
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,
sMacAddr,
Retvar : string;
pBuffer : pointer;
pInfo : PTransportInfo;
FNetTransportEnum : TNetTransportEnum;
FNetApiBufferFree : TNetApiBufferFree;
pszServer : array[0..128] of WideChar;
i,ii,iIdx : integer;
begin
sMachineName := '\\127.0.0.1';
Retvar := '00-00-00-00-00-00';
// 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);
IpList.Clear;
while pPtr^[I] <> nil do
begin // Enumerate all protocols - look for TCPIP
inc(pInfo);
if pos('TCPIP',UpperCase(pInfo^.transport_name)) <> 0 then begin
// Got It - now format result xx-xx-xx-xx-xx-xx
iIdx := 1;
sMacAddr := pInfo^.transport_address; for ii := 1 to 12 do begin
Retvar[iIdx] := sMacAddr[ii];
inc(iIdx);
if iIdx in [3,6,9,12,15] then inc(iIdx);
end;
end;
IpList.ADD( inet_ntoa(pptr^[I]^)+'='+Retvar);
Inc(I);
end;
finally
WSACleanup;
end;
if pBuffer <> nil then FNetApiBufferFree(pBuffer);
end; try
FreeLibrary(FLibHandle);
except
// 错误处理
end;
end;
result:=Retvar;
end;
AddrLen = 6;
var
PAdapterInfo: PIP_ADAPTER_INFO;
ret: DWORD;
i: integer;
Next: PIP_ADAPTER_INFO;
sMAC,sIp: string;
OutBufLen: ULONG;
begin
GetAdaptersInfo(nil, @OutBufLen); // to get the required size
// alloc memory size = OutBufLen
PAdapterInfo := AllocMem(OutBufLen);
ret:= GetAdaptersInfo(PAdapterInfo, @OutBufLen);
if ret = 0 then
begin
Next:= PAdapterInfo;
repeat
Memo1.Lines.Add('Deforbiddenion: '+ Next^.Deforbiddenion);
sMAC := 'MAC address: ';
for i := 0 to AddrLen do
begin
sMAC := sMAC + IntToHex(Next^.Address[i], 2);
if i <> AddrLen then
sMAC := sMAC + '-';
end;
sIp:= Next^.CurrentIPAddress;//取得當前網卡的ip地址
Memo1.Lines.Add(sMAC+':'+sIP);
Next:= Next^.Next;
until Next = nil;
end; FreeMem(PAdapterInfo, OutBufLen);end;
PIP_ADDRESS_STRING = ^IP_ADDRESS_STRING;
IP_ADDRESS_STRING = array[0..15] of char; // IP as string PIP_ADDR_STRING = ^IP_ADDR_STRING;
IP_ADDR_STRING = record
Next: PIP_ADDR_STRING;
IpAddress: IP_ADDRESS_STRING;
IpMask: IP_ADDRESS_STRING;
Context: DWORD;
end;
//------ADAPTER INFO STRUCTURES-------------------------------------------------
PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
IP_ADAPTER_INFO = record
Next: PIP_ADAPTER_INFO;
ComboIndex: DWORD;
AdapterName: array[1..MAX_ADAPTER_NAME_LENGTH + 4] of char;
Deforbiddenion: array[1..MAX_ADAPTER_DEforbiddenION_LENGTH + 4] of char;
AddressLength: UINT;
Address: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte;
Index: DWORD;
aType: UINT;
DHCPEnabled: UINT;
CurrentIPAddress: PIP_ADDR_STRING;
IPAddressList: IP_ADDR_STRING;
GatewayList: IP_ADDR_STRING;
DHCPServer: IP_ADDR_STRING;
HaveWINS: BOOL;
PrimaryWINSServer: IP_ADDR_STRING;
SecondaryWINSServer: IP_ADDR_STRING;
LeaseObtained: LongInt;
LeaseExpires: LongInt;
end; sIp:= Next^.CurrentIPAddress^.IpAddress;此API的來源
function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO;
pOutBufLen: PULONG): DWORD; stdcall;
external 'Iphlpapi.dll' name 'GetAdaptersInfo';