The RasEnumConnections returns an array of RASCONN structures. In VB we can declare the function as follows:
Declare Function RasEnumConnections _ Lib "rasapi32.dll" Alias "RasEnumConnectionsA" _ (lpRasconn As Any, _ lpcB As Long, _ lpcConnections As Long) As Long
Note: the lpRasconn parameter is usually an array of RASCONN structures, but I have declared it "As Any" so as we can use an array of bytes.
From the platform SDK, the RASCONN structure is defined as:
typedef struct _RASCONN { DWORD dwSize; HRASCONN hrasconn; TCHAR szEntryName[RAS_MaxEntryName + 1]; #if (WINVER >= 0x400) TCHAR szDeviceType[ RAS_MaxDeviceType + 1 ]; TCHAR szDeviceName[ RAS_MaxDeviceName + 1 ]; #End If #if (WINVER >= 0x401) TCHAR szPhonebook [ MAX_PATH ]; DWORD dwSubEntry; #End If #if (WINVER >= 0x500) GUID guidEntry; #End If } RASCONN ;
This gives us four possible sized structures being : 692, 676, 412, or 32 bytes long.
Our VB friendly type declaration for this structure would be as follows:
' VB "friendly" RASCONN structure Type VBRASCONN hRasConn As Long sEntryName As String sDeviceType As String sDeviceName As String sPhonebook As String lngSubEntry As Long guidEntry(15) As Byte End Type
The following code shows how to enumerate connections and populate an array of VBRASCONN structures. The function returns a long equal to the number of connections.
You could call this function like so:
Dim nConnections as Long
Dim myConnections() as VBRASCONN
nConnections = VBRasEnumConnections(myConnections)
Function VBRasEnumConnections(aVBRasConns() As VBRASCONN) As Long Dim rtn As Long Dim b() As Byte Dim aLens As Variant, dwSize As Long Dim lpcB As Long, lpConns As Long Dim i As Long ReDim b(3) aLens = Array(692&, 676&, 412&, 32&) For i = 0 To 3 dwSize = aLens(i) CopyMemory b(0), dwSize, 4 lpcB = 4 rtn = RasEnumConnections(b(0), lpcB, lpConns) If rtn <> 632 And rtn <> 610 Then Exit For Next i VBRasEnumConnections = lpConns If lpConns = 0 Then Exit Function lpcB = dwSize * lpConns ReDim b(lpcB - 1) CopyMemory b(0), dwSize, 4 rtn = RasEnumConnections(b(0), lpcB, lpConns) ' now copy the bytes to the aVBRasConns array ReDim aVBRasConns(lpConns - 1) For i = 0 To lpConns - 1 With aVBRasConns(i) CopyMemory .hRasConn, b(i * dwSize + 4), 4 If dwSize = 32& Then CopyByteToTrimmedString .sEntryName, b(i * dwSize + 8), 21& Else CopyByteToTrimmedString .sEntryName, b(i * dwSize + 8), 257& CopyByteToTrimmedString .sDeviceType, b(i * dwSize + 265), 17& CopyByteToTrimmedString .sDeviceName, b(i * dwSize + 282), 129& If dwSize > 412& Then CopyByteToTrimmedString .sPhonebook, b(i * dwSize + 411), 260& CopyMemory .lngSubEntry, b(i * dwSize + 672), 4 If dwSize > 676& Then CopyMemory .guidEntry(0), b(i * dwSize + 676), 16 End If End If End If End With Next i 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, Introduction