就这编文章所说(http://www.vckbase.com/document/viewdoc/?id=851),用读注册表的方式都可以读出正在使用网卡的信息,包括网卡名称,网卡ID,还知道连接名称叫什么(如我的连接2),但我在用VB写的过程序中发现在,如果你曾经删除又增加网卡(如网吧就是常事,因为刻盘)时,通过遍历 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\000n\(n是从0开始编号的数字)Ndi\Interfaces下的LowerRange的值为ethernet时就知道这是当前的正在使用的网卡一切信息,可我现在发现网吧的机器上这个键值下有N个LowerRange的值为ethernet的呀,如我曾经装过8139的网卡和intel的网卡,如果真的按上面这编文章所说,那我不知道要读出N个网卡呀,但其实电脑中只有一块网卡呀,只不过前面的网卡虽然没有了,但注册信息还是有的,那么我请问,有没有方法就是按上面这编文章所说修改一下,而正确的读出目前正在使用的网卡信息,难道有网卡的注册表和无这块网卡的注册表中有个什么标志,能证明这块网卡是空的?

解决方案 »

  1.   

    注册表的网卡信息并不准确,最好不要用。用API,非常简单就能获取。
      

  2.   

    那么请问兄台,用什么API搞定呀,怎么做呢,帮帮忙呀
      

  3.   

    Private Sub Command2_Click()
       Dim Stra  As String
       Dim LannaNumber As Long
        Stra = EthernetAddress(LannaNumber)
       Text1.Text = Stra
       Text2.Text = LannaNumber
    End SubPrivate 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 ' Reserved, must be 0
     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 TypePublic 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
      

  4.   

    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 LongPrivate Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long
    Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired&, lpWSAData As WSADATA) As Long
    Private Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long
    Private Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal hostname$) As Long
    Private Declare Sub RtlMoveMemory Lib "kernel32" (hpvDest As Any, ByVal hpvSource&, ByVal cbCopy&)