KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q175472: HOWTO: Get Network Adapter Address from Visual Basic

Article: Q175472
Product(s): Microsoft Visual Basic for Windows
Version(s): 
Operating System(s): 
Keyword(s): kbnetwork kbAPI kbNetBIOS kbSDKPlatform kbGrpDSNet
Last Modified: 11-JAN-2001

-------------------------------------------------------------------------------
The information in this article applies to:

- Microsoft Visual Basic Professional Edition for Windows, versions 4.0, 5.0, 6.0 
- Microsoft Visual Basic Enterprise Edition for Windows, versions 4.0, 5.0, 6.0 
-------------------------------------------------------------------------------

SUMMARY
=======

IPX and NETBIOS interfaces require network addresses. This article presents a
step-by-step example on how to use Netbios API call to get the network adapter
addresses from Microsoft Visual Basic.

MORE INFORMATION
================

Step-by-Step Example
--------------------

1. Create a new Standard EXE from Visual Basic. Form1 is created by default.

2. Add a CommandButton to Form1. Its default name is Command1.

3. Add the following code to the General Declarations section of 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

4. Add the following code to Command1_Click event procedure:

     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

5. Press the F5 key to run the program.

6. Click on Command1. Note that the network adapter address is displayed in a
  message box.

Additional query words: KBINetDev VKBWinAPI kbdsi kbDSupport kbVBp kbVBp400 kbVBp500 kbVBp600

======================================================================
Keywords          : kbnetwork kbAPI kbNetBIOS kbSDKPlatform kbGrpDSNet 
Technology        : kbVBSearch kbAudDeveloper kbZNotKeyword6 kbZNotKeyword2 kbVB500Search kbVB600Search kbVBA500 kbVBA600 kbVB500 kbVB600 kbVB400Search kbVB400
Issue type        : kbhowto

=============================================================================

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.