PlatformVB

RasGetConnectStatus

The RasGetConnectStatus function looks like this:

Declare Function RasGetConnectStatus _
      Lib "rasapi32.dll" Alias "RasGetConnectStatusA" _
        (ByVal hRasConn As Long, _
         lpRasConnStatus As Any) As Long

The hRasConn parameter is a connections handle which you got from the RasDial or RasEnumConnections functions.  The lpRasConnStatus is a RASCONNSTATUS structure which is defined in the Platform SDK as follows:

RASCONNSTATUSA
{
    DWORD        dwSize;  4
    RASCONNSTATE rasconnstate;  4
    DWORD        dwError; 4
    CHAR         szDeviceType[ RAS_MaxDeviceType + 1 ]; 17
    CHAR         szDeviceName[ RAS_MaxDeviceName + 1 ]; 129/33
#if (WINVER >= 0x401)
    CHAR         szPhoneNumber[ RAS_MaxPhoneNumber + 1 ];129
#End If
}

The RASCONNSTATUS structure can be three possible different sizes, being 288 bytes for NT4 enhanced and windows 2000, 160 bytes for windows 95/98 and NT4, and 64 bytes for NT3.51.

Our VB friendly structure could be defined as follows:

' VB "friendly" RASCONNSTATUS structure

Type VBRASCONNSTATUS
      lRasConnState As RASCONNSTATE
      dwError As Long
      sDeviceType As String
      sDeviceName As String
      sNTPhoneNumber As String
End Type

Note: the phone number of the connection is only returned on Windows NT4 enhanced and windows 2000.

To use this from VB, the following function wraps it all up, returning a long value that should be 0 if it succeeds, and filling a VBRASCONNSTATUS structure with the appropiate information.  If the function fails (non zero return value), use the VBRasErrorHandler function to get a descriptive string 

You can call this function from VB like so: (note: you need to already have the handle to an existing connection, hRasConn)

Dim rtn as long
Dim myConnStatus as VBRASCONNSTATUS

rtn = VBRasGetConnectStatus(hRasConn, myConnStatus)

If rtn <> 0 then MsgBox "failed"

 

Function VBRasGetConnectStatus _
               (hRasConn As Long, _
               udtVBRasConnStatus As VBRASCONNSTATUS) As Long

   Dim i As Long, dwSize As Long
   Dim aVarLens As Variant
   Dim b() As Byte

   aVarLens = Array(288&, 160&, 64&)
   
   For i = 0 To 2
      dwSize = aVarLens(i)
      ReDim b(dwSize - 1)
      CopyMemory b(0), dwSize, 4
      rtn = RasGetConnectStatus(hRasConn, b(0))
      If rtn <> 632 Then Exit For
   Next i
   
   VBRasGetConnectStatus = rtn
   If rtn <> 0 Then Exit Function
      
   With udtVBRasConnStatus
      CopyMemory .lRasConnState, b(4), 4
      CopyMemory .dwError, b(8), 4
      CopyByteToTrimmedString .sDeviceType, b(12), 17&
      If dwSize = 64& Then
         CopyByteToTrimmedString .sDeviceName, b(29), 33&
      ElseIf dwSize = 160& Then
         CopyByteToTrimmedString .sDeviceName, b(29), 129&
      Else
         CopyByteToTrimmedString .sDeviceName, b(29), 129&
         CopyByteToTrimmedString .sNTPhoneNumber, b(158), 129&
      End If
   End With
   
End Function
' helper function
Sub CopyByteToTrimmedString(strToCopyTo As String, _
                              bPos As Byte, lngMaxLen As Long)
   Dim strTemp As String, lngLen As Long
   strTemp = String(lngMaxLen + 1, 0)
   CopyMemory ByVal strTemp, bPos, lngMaxLen
   lngLen = InStr(strTemp, Chr$(0)) - 1
   strToCopyTo = Left$(strTemp, lngLen)
End Sub

 

 

 

See Also: Contents, IntroductionRASCONNSTATE, RasDial, RasEnumConnections