30分:不联网状态下取网卡MAC ( 积分: 30 )

  • 主题发起人 主题发起人 zqssoft
  • 开始时间 开始时间
Z

zqssoft

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在计算机没有联网的状态下,取得第一块网卡的MAC地址.
在网上搜索到的都是联网状态下的,不联网状态下取值为空.
30分,谢谢!
 
可惜我这里不允许贴代码出去,我前阵子刚写了的,
但是,网卡不能禁用,禁用了就获取不到
 
上面的兄弟,不会吧,还有哪位大哥,请帮助一下我!
 
楼主兄弟 你不要一而在的强调你的 30分了
说实在话30分是在好少啊 。
人家都300分呢
 
unit IPHlpAPI;

interface
uses
Windows,SysUtils,Classes;

const
MAX_ADAPTER_DESCRIPTION_LENGTH=128;
MAX_ADAPTER_NAME_LENGTH=256;
MAX_ADAPTER_ADDRESS_LENGTH=8;
DEFAULT_MINIMUM_ENTITIES=32;
MAX_HOSTNAME_LEN=128;
MAX_DOMAIN_NAME_LEN=128;
MAX_SCOPE_ID_LEN=256;

ERROR_NO_DATA:LongInt=232;
ERROR_NOT_SUPPORTED:LongInt=50;
ERROR_INVALID_PARAMETER:LongInt=87;
ERROR_BUFFER_OVERFLOW:LongInt=111;
type
time_t=Integer;
IP_ADDRESS_STRING=packed record
Addr:array [0..15] of Char;
end;
PIP_ADDRESS_STRING=^IP_ADDRESS_STRING;
IP_MASK_STRING=IP_ADDRESS_STRING;
PIP_MASK_STRING=^IP_MASK_STRING;
PIPAdapterInfo=^TIPAdapterInfo;
TIPAdapterInfo=packed record
Next:PIPAdapterInfo;//下一个节点的指针
ComboIndex:DWORD;
AdapterName:array [0..MAX_ADAPTER_NAME_LENGTH + 3] of Char; //适配器名称
Description:array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 3] of Char; //适配器描述信息
AddressLength:UINT;//Address域的最大长度,传递MAX_ADAPTER_ADDRESS_LENGTH常量即可
Address:array [0..MAX_ADAPTER_ADDRESS_LENGTH-1] of Byte;//适配器物理地址
Index:DWORD;
uType:UINT;
DhcpEnabled:UINT;
CurrentIpAddress:PIP_ADDRESS_STRING;
IpAddressList:IP_ADDRESS_STRING;
GatewayList:IP_ADDRESS_STRING;
DhcpServer:IP_ADDRESS_STRING;
HaveWins:BOOL;
PrimaryWinsServer:IP_ADDRESS_STRING;
SecondaryWinsServer:IP_ADDRESS_STRING;
LeaseObtained:time_t;
LeaseExpires:time_t;
end;

//此函数功能最强大,而且只要求网卡在系统中可用,并不要求一定连接上网络
function GetAdaptersInfo(Buf:PIPAdapterInfo;var BufLen:ULONG):DWORD;stdcall;
function GetMacAddresses(String:TStrings):DWORD;

implementation

function GetAdaptersInfo;external 'iphlpapi.dll' name 'GetAdaptersInfo';

function GetMACFromBuf(Buf:array of Byte;Start:Integer=-1):string;
var
I:Integer;
begin
Result:='';
if Start=-1 then
Start:=Low(Buf);
if High(Buf)-Start<5 then Exit;
for I:=Start to Start+5 do
begin
if I>Low(Buf) then Result:=Result+'-';
Result:=Result+IntToHex(Buf,2);
end;
end;

function GetMacAddresses(String:TStrings):DWORD;
var
pList,pBuf:PIPAdapterInfo;
Len:DWORD;
begin
Strings.Clear;
Len:=SizeOf(TIPAdapterInfo);
GetMem(pList,Len);
Result:=GetAdaptersInfo(pList,Len);
if Result=ERROR_BUFFER_OVERFLOW then
begin
FreeMem(pList);
GetMem(pList,Len);
Result:=GetAdaptersInfo(pList,Len);
end;
if Result=ERROR_SUCCESS then
begin
pBuf:=pList;
while pBuf<>nil do
Strings.Add(GetMACFromBuf(pBuf.Address));
end;
FreeMem(pList);
end;

end.

引用此单元,调用其中的GetMacAddresses函数,传递的TStrings对象中就包含了本机器所有可用网卡的MAC地址。取哪一个就随便你了。另外还有集中取网卡MAC地址的方法,请参见http://hi.baidu.com/523399/blog/item/4c71ce07072223cf7a894751.html

顺便bs一下楼上的,回答问题就是为了分?
 
接受答案了.
 

Similar threads

回复
0
查看
588
不得闲
回复
0
查看
795
不得闲
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
887
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部