一个得到网卡号的函数,100分求详细解释

zhoujiamurong 2004-11-12 11:23:36
Option Explicit

Private Const NCBASTAT = &H33
Private Const NCBNAMSZ = 16
Private Const HEAP_ZERO_MEMORY = &H8
Private Const HEAP_GENERATE_EXCEPTIONS = &H4
Private Const NCBRESET = &H32

Private Type NCB
ncb_command As Byte
ncb_retcode As Byte
ncb_lsn As Byte
ncb_num As Byte
ncb_buffer As Long
ncb_length As Integer
ncb_callname As String * NCBNAMSZ
ncb_name As String * NCBNAMSZ
ncb_rto As Byte
ncb_sto As Byte
ncb_post As Long
ncb_lana_num As Byte
ncb_cmd_cplt As Byte
ncb_reserve(9) As Byte
ncb_event As Long
End Type

Private Type ADAPTER_STATUS
adapter_address(5) As Byte
rev_major As Byte
reserved0 As Byte
adapter_type As Byte
rev_minor As Byte
duration As Integer
frmr_recv As Integer
frmr_xmit As Integer
iframe_recv_err As Integer
xmit_aborts As Integer
xmit_success As Long
recv_success As Long
iframe_xmit_err As Integer
recv_buff_unavail As Integer
t1_timeouts As Integer
ti_timeouts As Integer
Reserved1 As Long
free_ncbs As Integer
max_cfg_ncbs As Integer
max_ncbs As Integer
xmit_buf_unavail As Integer
max_dgram_size As Integer
pending_sess As Integer
max_cfg_sess As Integer
max_sess As Integer
max_sess_pkt_size As Integer
name_count As Integer
End Type

Private Type NAME_BUFFER
name As String * NCBNAMSZ
name_num As Integer
name_flags As Integer
End Type

Private Type ASTAT
adapt As ADAPTER_STATUS
NameBuff(30) As NAME_BUFFER
End Type

Private Declare Function Netbios Lib "netapi32.dll" (pncb As NCB) As Byte
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)
Private Declare Function GetProcessHeap Lib "kernel32" () As Long
Private Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long


Public Function EthernetAddress(LanaNumber As Long) As String
Dim udtNCB As NCB
Dim bytResponse As Byte
Dim udtASTAT As ASTAT
Dim udtTempASTAT As ASTAT
Dim lngASTAT As Long
Dim strOut As String
Dim x As Integer

udtNCB.ncb_command = NCBRESET
bytResponse = Netbios(udtNCB)
udtNCB.ncb_command = NCBASTAT
udtNCB.ncb_lana_num = LanaNumber
udtNCB.ncb_callname = "* "
udtNCB.ncb_length = Len(udtASTAT)
lngASTAT = HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS Or HEAP_ZERO_MEMORY, udtNCB.ncb_length)
strOut = ""
If lngASTAT Then
udtNCB.ncb_buffer = lngASTAT
bytResponse = Netbios(udtNCB)
CopyMemory udtASTAT, udtNCB.ncb_buffer, Len(udtASTAT)
With udtASTAT.adapt
For x = 0 To 5
strOut = strOut & Right$("00" & Hex$(.adapter_address(x)), 2)
Next x
End With
HeapFree GetProcessHeap(), 0, lngASTAT
End If
EthernetAddress = strOut
End Function
...全文
321 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoujiamurong 2004-11-21
  • 打赏
  • 举报
回复
我开源散分,主要是要想弄清楚,大家讨论一下
fivestars 2004-11-19
  • 打赏
  • 举报
回复
以下是代码,和楼主差不多
呵呵,但是我在使用中发现,大部分网卡可以读出,有些网卡读出为全0,有些网卡读出和ipconfig/all中读出的不一致,和什么有关??和硬件?还是软件问题?
大家讨论一下

Option Explicit

Private Const NCBASTAT = &H33 ' NCB ADAPTER STATUS
Private Const NCBNAMSZ = 16 ' absolute length of a net name
Private Const HEAP_ZERO_MEMORY = &H8
Private Const HEAP_GENERATE_EXCEPTIONS = &H4
Private Const NCBRESET = &H32 ' NCB RESET

Private Type NCB
ncb_command As Byte 'Integer
ncb_retcode As Byte 'Integer
ncb_lsn As Byte 'Integer
ncb_num As Byte ' Integer
ncb_buffer As Long 'String
ncb_length As Integer
ncb_callname As String * NCBNAMSZ
ncb_name As String * NCBNAMSZ
ncb_rto As Byte 'Integer
ncb_sto As Byte ' Integer
ncb_post As Long
ncb_lana_num As Byte 'Integer
ncb_cmd_cplt As Byte 'Integer
ncb_reserve(9) As Byte ' Reserved, must be 0
ncb_event As Long
End Type
Private Type ADAPTER_STATUS
adapter_address(5) As Byte 'As String * 6
rev_major As Byte 'Integer
reserved0 As Byte 'Integer
adapter_type As Byte 'Integer
rev_minor As Byte 'Integer
duration As Integer
frmr_recv As Integer
frmr_xmit As Integer
iframe_recv_err As Integer
xmit_aborts As Integer
xmit_success As Long
recv_success As Long
iframe_xmit_err As Integer
recv_buff_unavail As Integer
t1_timeouts As Integer
ti_timeouts As Integer
Reserved1 As Long
free_ncbs As Integer
max_cfg_ncbs As Integer
max_ncbs As Integer
xmit_buf_unavail As Integer
max_dgram_size As Integer
pending_sess As Integer
max_cfg_sess As Integer
max_sess As Integer
max_sess_pkt_size As Integer
name_count As Integer
End Type
Private Type NAME_BUFFER
name As String * NCBNAMSZ
name_num As Integer
name_flags As Integer
End Type
Private Type ASTAT
adapt As ADAPTER_STATUS
NameBuff(30) As NAME_BUFFER
End Type

Private Declare Function Netbios Lib "netapi32.dll" (pncb As NCB) As Byte
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)
Private Declare Function GetProcessHeap Lib "kernel32" () As Long
Private Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long

Function GetMac() As String
Dim myNcb As NCB
Dim bRet As Byte

myNcb.ncb_command = NCBRESET
bRet = Netbios(myNcb)
myNcb.ncb_command = NCBASTAT
myNcb.ncb_lana_num = 0
myNcb.ncb_callname = "* "

Dim myASTAT As ASTAT, tempASTAT As ASTAT
Dim pASTAT As Long
myNcb.ncb_length = Len(myASTAT)
Debug.Print Err.LastDllError
pASTAT = HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS Or HEAP_ZERO_MEMORY, myNcb.ncb_length)
If pASTAT = 0 Then
Debug.Print "memory allcoation failed!"
Exit Function
End If
myNcb.ncb_buffer = pASTAT
bRet = Netbios(myNcb)
Debug.Print Err.LastDllError
CopyMemory myASTAT, myNcb.ncb_buffer, Len(myASTAT)
MsgBox Hex(myASTAT.adapt.adapter_address(0)) & " " & Hex(myASTAT.adapt.adapter_address(1)) & " " & Hex(myASTAT.adapt.adapter_address(2)) & " " & Hex(myASTAT.adapt.adapter_address(3)) & " " & Hex(myASTAT.adapt.adapter_address(4)) & " " & Hex(myASTAT.adapt.adapter_address(5))
HeapFree GetProcessHeap(), 0, pASTAT
End Function



vbangle 2004-11-19
  • 打赏
  • 举报
回复
谢谢,楼主真是好
又开源又散分
sanwaxubin 2004-11-18
  • 打赏
  • 举报
回复
0 应该是代表第一块网卡的意思
如果你的机器有2块网卡,就可以用EthernetAddress(1) 就可以取得第二块网卡的地址啊!
zhoujiamurong 2004-11-17
  • 打赏
  • 举报
回复
谢谢大家讲了一点,但有难度的东西都没讲清楚
*********************************************
调用CopyMemory函数,返回网卡的地址值,是16进制的串号..
**********************************************
为什么调用CopyMemory函数,就返回网卡的地址???

关于这个函数调用就是用EthernetAddress(0)就可以了,我也不明白为什么是0
helanshan 2004-11-13
  • 打赏
  • 举报
回复
EthernetAddress(0)调用时为什么传了0过来,0是代表什么?

这个0好象是网卡的序号,象0001,0002.
--------------------------------------------------------
------------------------------------------------------
udtNCB.ncb_command = NCBRESET
bytResponse = Netbios(udtNCB)
这两句不要也可以,这两句是做什么的?

udtNCB是NCB类型的对象,将NCBRESET = &H32的值赋给变量ncb_command
bytResponse = Netbios(udtNCB) '得到API函数返回的值
---------------------------------------------------------------
------------------------------------------------------------------
CopyMemory udtASTAT, udtNCB.ncb_buffer, Len(udtASTAT)
为什么一拷贝就可以有网卡号了
调用CopyMemory函数,返回网卡的地址值,是16进制的串号..


zhoujiamurong 2004-11-13
  • 打赏
  • 举报
回复
CopyMemory udtASTAT, udtNCB.ncb_buffer, Len(udtASTAT)
为什么一拷贝就可以有网卡号了
zhoujiamurong 2004-11-13
  • 打赏
  • 举报
回复
udtNCB.ncb_command = NCBRESET
bytResponse = Netbios(udtNCB)
这两句不要也可以,这两句是做什么的?
zhoujiamurong 2004-11-13
  • 打赏
  • 举报
回复
EthernetAddress(0)调用时为什么传了0过来,0是代表什么?
Gujianda 2004-11-13
  • 打赏
  • 举报
回复
这个函数很有吸引力,可是搂主似乎不舍得给出调用规则?
zhoujiamurong 2004-11-13
  • 打赏
  • 举报
回复
谢谢大家的回复
zhoujiamurong 2004-11-13
  • 打赏
  • 举报
回复
CopyMemory本身只是拷贝内存块,并不返回网卡呀
Andy__Huang 2004-11-12
  • 打赏
  • 举报
回复
用sql server的代碼也可以取得
zhoujiamurong 2004-11-12
  • 打赏
  • 举报
回复
没人知道吗
gg137zeus 2004-11-12
  • 打赏
  • 举报
回复
关注
up 4 u
helanshan 2004-11-12
  • 打赏
  • 举报
回复
这些数据类型是API函数中已经定义好的(多看点C/C++方面的书,便于理解API函数,看点函数原形,了解这些结构类型).
定义类型是为了方便引用一组不同类型的数据而定义的..
1.自定义类型必须在标准模块中定义.
2.自定义类型中的元素类型如果是字符串类型,必须是定长字符串.
(如:ncb_callname As String * NCBNAMSZ 'Private Const NCBNAMSZ = 16)
helanshan 2004-11-12
  • 打赏
  • 举报
回复
为甚么有*号
------------------
属于定长字符串.
Abyss-Xu 2004-11-12
  • 打赏
  • 举报
回复
学习
zhoujiamurong 2004-11-12
  • 打赏
  • 举报
回复
adapter_address(5) As Byte这个(5)是数组吗
zhoujiamurong 2004-11-12
  • 打赏
  • 举报
回复
为甚么有*号
加载更多回复(4)

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧