频道栏目
首页 > 程序开发 > 软件开发 > Delphi > 正文
delphi技术专题---获取网卡物理地址之内存获取方式函数源码
2013-01-27 09:15:13           
收藏   我要投稿
先贴代码:

[delphi]  

{----------------------------------------------------------------------------\- 

作者:sushengmiyan 2013.01.26 

参数:Alana: Integer = 0 

返回:string 

功能:通过LANA号获取Mac物理地址 (内存方式获取),整体步骤如下: 

    一、枚举系统上可用的所有LANA编号 

    二、重置计划使用的每个LANA编号 

    三、适配器命令获取网卡地址 

\-----------------------------------------------------------------------------}  

  

function MemGetNetCardName(Alana: Integer = 0): string;  

var  

  NCB: TNCB;//Netbios控制块  

  AdapterStatus: TAdapterStatus;//取网卡状态  

  LanaEnum: TLanaEnum; //LANA枚举值  

  I: Integer;  

  CRC: Char;//netBios返回值  

begin  

  Result := '';  

  Try  

  { https://blog.csdn.net/sushengmiyan/article/details/8543811 

    一、枚举LANA值 

      ①.申请分配一个TNCB结构           NCB: TNCB; 

      ②.将TNCB结构变量初始化成O        ZeroMemory(@NCB , SizeOf(NCB)); 

      ③.置命令为NCBENUM                NCB.ncb_Command := chr(NCBENUM); 

      ④.为ncb_buffer分配LANA_ENUM      NCB.ncb_buffer := @LANAENUM; 

      ⑤.为NCB_length制定长度           NCB.NCB_length := Sizeof(LANAENUM); 

      ⑥.调用Netbios函数获取Netbios     CRC := NetBios(@NCB); 

      ⑦.返回值NRC_GOODRET表示成功      NCB.ncb_retcode = Chr(NRC_GOODRET) 

    }  

    ZeroMemory(@NCB , SizeOf(NCB));  

    NCB.ncb_Command := Chr(NCBENUM);  

    NCB.ncb_buffer := @LANAENUM;  

    NCB.NCB_length := Sizeof(LANAENUM);  

    CRC := NetBios(@NCB);  

    if not (NCB.ncb_retcode = Chr(NRC_GOODRET)) then Exit;  

  

  

  { https://blog.csdn.net/sushengmiyan/article/details/8543811 

    二、重置计划使用的每个LANA编号 

      ①.申请分配一个TNCB结构           NCB: TNCB; 

      ②.将TNCB结构变量初始化成O        ZeroMemory(@NCB , SizeOf(NCB)); 

      ③.置命令为NCBRESET               NCB.ncb_Command := chr(NCBRESET); 

      ④.给命令设置LANA编号             NCB.ncb_lana_num := LanaEnum.lana[Alana]; 

      ⑤.调用Netbios函数获取Netbios     CRC := NetBios(@NCB); 

      ⑥.返回值NRC_GOODRET表示成功      NCB.ncb_retcode = Chr(NRC_GOODRET) 

    }  

    ZeroMemory(@NCB , SizeOf(NCB));  

    NCb.ncb_Command := Chr(NCBRESET);  

    NCB.ncb_lana_num := LanaEnum.lana[Alana];  

    CRC := Netbios(@NCB);  

    if not (NCB.ncb_retcode = Chr(NRC_GOODRET)) then Exit;  

  

   { https://blog.csdn.net/sushengmiyan/article/details/8543811 

    三、使用TAdapterStatus结构获取网卡地址 

      ①.申请分配一个TNCB结构           NCB: TNCB; 

      ②.将TNCB结构变量初始化成O        ZeroMemory(@NCB , SizeOf(NCB)); 

      ③.置命令为NCBASTAT               NCB.ncb_Command := chr(NCBASTAT); 

      ④.为ncb_buffer分配LANA_ENUM      NCB.ncb_buffer := @LANAENUM; 

      ⑤.设置ncb_callname               NCB.ncb_callname := '* ' + #0; 

      ⑥.为ncb_buffer分配AdapterStatus  NCB.ncb_buffer := @AdapterStatus; 

      ⑦.为NCB_length制定长度           NCB.NCB_length := Sizeof(AdapterStatus); 

      ⑧.调用Netbios函数获取Netbios     CRC := NetBios(@NCB); 

    }  

    ZeroMemory(@NCB , SizeOf(NCB));  

    NCb.ncb_Command := chr(NCBASTAT);  

    NCB.ncb_lana_num := LANAENUM.lana[Alana];  

    NCB.ncb_callname := '* ' + #0;  

    //不明白为何如此设置,*代表啥子?  

    //有懂的可以邮件分享 429119108@qq.com   O(∩_∩)O谢谢  

    NCB.ncb_buffer := @AdapterStatus;  

    NCB.ncb_length := SizeOf(AdapterStatus);  

    CRC := NetBios(@NCB);  

  

    //获取形如AA-BB-CC-DD-EE-FF形式的mac物理地址字符串  

    Result := '';  

    for I := 0 to 5 do  

    if SameStr(Result , '') then  

      Result := Result + IntToHex(Integer(AdapterStatus.adapter_address[I]) , 2)  

    else  

      Result := Result + '-' + IntToHex(Integer(AdapterStatus.adapter_address[I]) , 2);  

  Finally  

  

  End;  

end;  

 

关于理论方面的知识,前面已经介绍过了,如果遇到不明白的可以去前面几篇文章查看,这里面我也有不明白的,希望有明白的可以指教一下~O(∩_∩)O谢谢。

查看获取的mac地址是否正确的方式:

在Windows 2000/XP/Vista/WIN8中

点击 开始-运行-进入后输入ipconfig /all

在出现的结果中查找‘物理地址’或者Physical Address后的字符串即可。

 

点击复制链接 与好友分享!回本站首页
上一篇:delphi技术专题---获取网卡物理地址之TLanaENum结构步骤学习分享
下一篇:Delphi格式化函数Format、FormatDateTime和FormatFloat
相关文章
图文推荐
文章
推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站