找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5323|回复: 0

【分享】马大哈系列功能模块----取得本机所有网卡(网络连接)MAC地址(VB6代码)

[复制链接]

275

主题

3019

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17066

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-9-29 09:37:02 | 显示全部楼层 |阅读模式
这个是我根据MSDN示例翻译的,系统要求为至少XP.

GetAdaptersAddresses是从ipconfig.exe的导入表里看到的,哈.

封装后,使用很简单,如下调用:
  1. msgbox GetPhysicalAddress()(0)      '第一个网卡的MAC地址
复制代码



代码:

  1. Option Explicit
  2. '*************************************************************************
  3. '**模 块 名:ModGetPhysicalAddress
  4. '**说 明:取得本机所有网卡的MAC地址
  5. '**创 建 人:嗷嗷叫的老马
  6. '**日 期:2010年09月28日
  7. '**备 注: 紫水晶工作室 版权所有
  8. '** 更多模块/类模块请访问我站: http://www.m5home.com
  9. '**版 本:V1.0
  10. '*************************************************************************

  11. Private Const HEAP_ZERO_MEMORY As Long = &H8&
  12. Private Const ERROR_BUFFER_OVERFLOW As Long = &H6F&
  13. Private Const GAA_FLAG_INCLUDE_PREFIX As Long = &H10&
  14. Private Const MAX_ADAPTER_ADDRESS_LENGTH As Long = &H8&
  15. Private Const MAX_ADAPTER_NAME_LENGTH As Long = &H100&
  16. Private Const AF_UNSPEC As Long = &H0&
  17. Private Const NO_ERROR As Long = &H0&

  18. Private Enum IF_TYPE
  19. IF_TYPE_OTHER = 1
  20. IF_TYPE_ETHERNET_CSMACD = 6
  21. IF_TYPE_ISO88025_TOKENRING = 9
  22. IF_TYPE_PPP = 23
  23. IF_TYPE_SOFTWARE_LOOPBACK = 24
  24. IF_TYPE_ATM = 37
  25. IF_TYPE_IEEE80211 = 71
  26. IF_TYPE_TUNNEL = 131
  27. IF_TYPE_IEEE1394 = 144
  28. End Enum

  29. Private Enum IF_OPER_STATUS
  30. IfOperStatusUp = 1
  31. IfOperStatusDown = 2
  32. IfOperStatusTesting = 3
  33. IfOperStatusUnknown = 4
  34. IfOperStatusDormant = 5
  35. IfOperStatusNotPresent = 6
  36. IfOperStatusLowerLayerDown = 7
  37. End Enum

  38. Private Type IP_ADAPTER_ADDRESSES
  39. Length As Long '原型里的联合体,直接拆开
  40. IfIndex As Long
  41. pNext As Long '指向下一个IP_ADAPTER_ADDRESSES结构的指针,类似单向链表了
  42. AdapterName As Long 'PCHAR
  43. FirstUnicastAddress As Long 'IP_ADAPTER_UNICAST_ADDRESS
  44. FirstAnycastAddress As Long 'IP_ADAPTER_ANYCAST_ADDRESS
  45. FirstMulticastAddress As Long 'IP_ADAPTER_MULTICAST_ADDRESS
  46. FirstDnsServerAddress As Long 'IP_ADAPTER_DNS_SERVER_ADDRESS
  47. lpDnsSuffix As Long 'PWCHAR
  48. lpDescription As Long 'PWCHAR
  49. lpFriendlyName As Long 'PWCHAR
  50. PhysicalAddress(MAX_ADAPTER_ADDRESS_LENGTH - 1) As Byte
  51. PhysicalAddressLength As Long
  52. Flags As Long
  53. MTU As Long
  54. IfType As IF_TYPE
  55. OperStatus As IF_OPER_STATUS
  56. End Type

  57. Private Declare Function GetAdaptersAddresses Lib "iphlpapi" ( _
  58. ByVal Family As Long, _
  59. ByVal Flags As Long, _
  60. ByVal Reserved As Long, _
  61. ByVal AdapterAddresses As Long, _
  62. ByRef SizePointer As Long) As Long

  63. Private Declare Function GetProcessHeap Lib "Kernel32" ( _
  64. ) As Long

  65. Private Declare Function HeapAlloc Lib "Kernel32" ( _
  66. ByVal hHeap As Long, _
  67. ByVal dwFlags As Long, _
  68. ByVal dwBytes As Long) As Long

  69. Private Declare Function HeapReAlloc Lib "Kernel32" ( _
  70. ByVal hHeap As Long, _
  71. ByVal dwFlags As Long, _
  72. ByVal lpMem As Long, _
  73. ByVal dwBytes As Long) As Long

  74. Private Declare Function HeapFree Lib "Kernel32" ( _
  75. ByVal hHeap As Long, _
  76. ByVal dwFlags As Long, _
  77. ByVal lpMem As Long) As Long

  78. Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" ( _
  79. ByVal Destination As Long, _
  80. ByVal Source As Long, _
  81. ByVal Length As Long)

  82. Private Declare Function lstrlenW Lib "Kernel32" ( _
  83. ByVal ptr As Long) As Long

  84. Private Function GetStrFromPtr(ByVal ptr As Long) As String
  85. '从指针得到字符串
  86. Dim Buffer() As Byte
  87. Dim lpSize As Long

  88. lpSize = lstrlenW(ptr) * 2
  89. If lpSize <> 0 Then
  90. ReDim Buffer(lpSize)
  91. CopyMemory VarPtr(Buffer(0)), ptr, lpSize
  92. GetStrFromPtr = Buffer
  93. End If
  94. End Function

  95. Private Function GetHex(ByRef inByte() As Byte) As String
  96. '将字节数据以十六进制字符串输出
  97. Dim I As Long, J() As String, K As Long

  98. ReDim J(UBound(inByte))

  99. For I = 0 To UBound(J)
  100. J(I) = "00"
  101. RSet J(I) = CStr(Hex(inByte(I)))
  102. Next

  103. GetHex = Replace(Join(J(), "-"), " ", "0")
  104. End Function

  105. Public Function GetPhysicalAddress() As String()
  106. '取网卡MAC地址
  107. '
  108. '无输入参数.
  109. '返回值:
  110. ' 字符串数组,包含本机所有网络连接的MAC地址.
  111. '备注:
  112. ' 每个网络连接并不一定对应一个物理网卡,但仍然可以拥有MAC地址
  113. Dim IPAA As IP_ADAPTER_ADDRESSES, pAdapterAddresses As Long
  114. Dim outBufLen As Long, Flags As Long, Family As Long
  115. Dim lRet As Long, dwIndex As Long, I As Long
  116. Dim outBuff() As String

  117. Flags = GAA_FLAG_INCLUDE_PREFIX
  118. Family = AF_UNSPEC
  119. outBufLen = 0

  120. pAdapterAddresses = HeapAlloc(GetProcessHeap, HEAP_ZERO_MEMORY, 32)

  121. lRet = GetAdaptersAddresses(Family, Flags, 0, pAdapterAddresses, outBufLen) '第一次调用,如果缓冲区不够,会在outBufLen里返回所需要的缓冲区大小
  122. '原示例中使用一次性分配大量空间的做法,觉得不太爽:)

  123. If lRet = ERROR_BUFFER_OVERFLOW Then '如果返回溢出,则重分配足够的内存
  124. pAdapterAddresses = HeapReAlloc(GetProcessHeap, HEAP_ZERO_MEMORY, pAdapterAddresses, outBufLen)
  125. End If

  126. lRet = GetAdaptersAddresses(Family, Flags, 0, pAdapterAddresses, outBufLen) '这次是正式取了

  127. If lRet = NO_ERROR Then
  128. I = 0
  129. ReDim outBuff(I)

  130. Call CopyMemory(VarPtr(IPAA.Length), pAdapterAddresses, LenB(IPAA)) '复制第一个结构
  131. outBuff(I) = GetHex(IPAA.PhysicalAddress())

  132. Debug.Print GetStrFromPtr(IPAA.lpFriendlyName); IPAA.OperStatus; IPAA.IfType
  133. Debug.Print outBuff(I)
  134. Debug.Print

  135. Do While IPAA.pNext <> 0
  136. I = I + 1
  137. ReDim Preserve outBuff(I)

  138. Call CopyMemory(VarPtr(IPAA.Length), ByVal IPAA.pNext, Len(IPAA)) '复制下一个结构,pNext中保存的是指向下一个结构的指针
  139. outBuff(I) = GetHex(IPAA.PhysicalAddress())

  140. Debug.Print GetStrFromPtr(IPAA.lpFriendlyName); IPAA.OperStatus; IPAA.IfType
  141. Debug.Print outBuff(I)
  142. Debug.Print
  143. Loop
  144. End If
  145. HeapFree GetProcessHeap, 0, pAdapterAddresses
  146. GetPhysicalAddress = outBuff
  147. End Function
复制代码


打包下载地址:

http://www.m5home.com/blog/article.asp?id=510
我就是嗷嗷叫的老马了......

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表