Option ExplicitPrivate Const NCBASTAT = &H33
Private Const NCBNAMSZ = 16
Private Const HEAP_ZERO_MEMORY = &H8
Private Const HEAP_GENERATE_EXCEPTIONS = &H4
Private Const NCBRESET = &H32Private 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 TypePrivate 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 TypePrivate Type NAME_BUFFER
name As String * NCBNAMSZ
name_num As Integer
name_flags As Integer
End TypePrivate Type ASTAT
adapt As ADAPTER_STATUS
NameBuff(30) As NAME_BUFFER
End TypePrivate 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 IntegerudtNCB.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

解决方案 »

  1.   

    用sql server的代碼也可以取得
      

  2.   

    ncb_callname As String * NCBNAMSZ
    ncb_name As String * NCBNAMSZ
    讲一下 这两句的用法
      

  3.   

    Private Const NCBNAMSZ = 16
    ncb_callname As String * NCBNAMSZ
    ncb_name As String * NCBNAMSZ
     
    定义ncb_callname, ncb_name 为16位长的string
      

  4.   

    adapter_address(5) As Byte这个(5)是数组吗
      

  5.   

    这些数据类型是API函数中已经定义好的(多看点C/C++方面的书,便于理解API函数,看点函数原形,了解这些结构类型).
    定义类型是为了方便引用一组不同类型的数据而定义的..
    1.自定义类型必须在标准模块中定义.
    2.自定义类型中的元素类型如果是字符串类型,必须是定长字符串.
    (如:ncb_callname As String * NCBNAMSZ    'Private Const NCBNAMSZ = 16)
      

  6.   

    EthernetAddress(0)调用时为什么传了0过来,0是代表什么?
      

  7.   

    udtNCB.ncb_command = NCBRESET
    bytResponse = Netbios(udtNCB)
    这两句不要也可以,这两句是做什么的?
      

  8.   

    CopyMemory udtASTAT, udtNCB.ncb_buffer, Len(udtASTAT)
    为什么一拷贝就可以有网卡号了
      

  9.   

    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进制的串号..
      

  10.   

    CopyMemory本身只是拷贝内存块,并不返回网卡呀
      

  11.   

    谢谢大家讲了一点,但有难度的东西都没讲清楚
    *********************************************
    调用CopyMemory函数,返回网卡的地址值,是16进制的串号..
    **********************************************
    为什么调用CopyMemory函数,就返回网卡的地址???关于这个函数调用就是用EthernetAddress(0)就可以了,我也不明白为什么是0
      

  12.   

    0 应该是代表第一块网卡的意思
    如果你的机器有2块网卡,就可以用EthernetAddress(1) 就可以取得第二块网卡的地址啊!
      

  13.   

    以下是代码,和楼主差不多
    呵呵,但是我在使用中发现,大部分网卡可以读出,有些网卡读出为全0,有些网卡读出和ipconfig/all中读出的不一致,和什么有关??和硬件?还是软件问题?
    大家讨论一下Option ExplicitPrivate 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 RESETPrivate 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 TypePrivate 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 LongFunction 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