如何通过VB获取网卡地址

  • 来源: 网易学院 作者: sevenleaf   2010-05-04/09:26
  •       程序语言: Microsoft Visual Basic 4.0,5.0,6.0

          运行平台: WINDOWS

          功能描述: IPX和NETBIOS接口需要网络地址。该文通过详细的步骤演示了如何通过VB获取网卡地址。

          步骤:

          1)在Visual Basic生成标准的EXE文件。缺省创建 Form1。

          2)在Form1中添加一命令按钮,缺省名为Command1。

          3)把下列代码放到Form1中说明部分。

    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 '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

    把下面的代码放入Command1_Click的事件中:

    Private Sub Command1_Click()

    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 Sub

    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 Sub

          4)按F5,运行该程序。

          5)点击Command1。注意,网卡地址将在一信息框中显示出来。


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多