用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心编程技巧Delphi

获得远程或本地机器的网卡的MAC

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-03-16 20:02:58
下面的函数以''XX-XX-XX-XX-XX-XX'' 的格式返回远程或本地机器的MAC地址。

Function to return the MAC address of a remote or local machine in the format ''XX-XX-XX-XX-XX-XX''

返回的MAC地址是一个能用在多个方面的唯一标识。使用方法:
ShowMessage(GetMacAddress(''\\MHEYDON'');
输出''00-02-08-E7-99-6B''

// ======================================================================
//返回值是主机AServerName的MAC地址
//AServerName参数的格式为''\\ServerName'' 或者 ''ServerName''
//参数ServerName为空时返回本机的MAC地址
//MAC地址以''XX-XX-XX-XX-XX-XX''的格式返回
// ======================================================================

function GetMacAddress(const AServerName : string) : 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;

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;

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:8,843.75000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号