conns.cls

来自「本书源码主要针对目前流行的FTP、HTTP、E-mail、Telnet、ICMP」· CLS 代码 · 共 241 行

CLS
241
字号
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "Connections"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit

'连接的个数
Private intCCount As Integer
'********************************************************************

Public Property Get Count() As Integer

   '获得连接的个数
   Dim lngRetCode

   lngRetCode = fcnRASEnumConnections()
   If lngRetCode Then
      Err.Raise vbObjectError + lngRetCode, "Connections.Count Failure", "RAS Failure"
   Else
      Count = intCCount
   End If

End Property

Private Function fcnRASEnumConnections() As Long
 
   Dim lngRetCode As Long
   Dim lpcb As Long
   Dim lpcConnections As Long
   Dim intArraySize As Integer
   Dim intLooper As Integer
   
   '定义256个连接,如果不够,可以再增加
   intArraySize = 255
   If lngWindowVersion = 2 Then
      'NT系统
      ReDim lprasconn(intArraySize) As RASCONN
      lprasconn(0).dwSize = 32
      lpcb = 256 * lprasconn(0).dwSize
      lngRetCode = RasEnumConnections(lprasconn(0), lpcb, lpcConnections)
   Else
      '95/98系统
      '定义结构体数组
      ReDim lprasconn95(intArraySize) As RASCONN95
      lprasconn95(0).dwSize = 412
      lpcb = 256 * lprasconn95(0).dwSize
      '获得各个活动连接
      lngRetCode = RasEnumConnections(lprasconn95(0), lpcb, lpcConnections)
   End If
   Select Case lngRetCode
      Case SUCCESS
         '如果成功
         If lpcConnections > 0 Then
            ReDim arrConnection(lpcConnections - 1) As Connection
            If lngWindowVersion = 2 Then
                'NT系统
                For intLooper = 0 To UBound(arrConnection())
                    Set arrConnection(intLooper) = New Connection
                    '允许修改电话簿
                    boolAllowUpdate = True
                    arrConnection(intLooper).hRasConn = lprasconn(intLooper).hRasConn
                    arrConnection(intLooper).EntryName = fcnTrimNulls(StrConv(lprasconn(intLooper).szEntryName, vbUnicode))
                    arrConnection(intLooper).Index = intLooper
                    boolAllowUpdate = False
                Next intLooper
            Else
                    '95/98系统
                    For intLooper = 0 To UBound(arrConnection())
                    Set arrConnection(intLooper) = New Connection
                    '允许修改电话簿
                    boolAllowUpdate = True
                    arrConnection(intLooper).hRasConn = lprasconn95(intLooper).hRasConn
                    arrConnection(intLooper).EntryName = fcnTrimNulls(StrConv(lprasconn95(intLooper).szEntryName, vbUnicode))
                    arrConnection(intLooper).Index = intLooper
                    boolAllowUpdate = False
                Next intLooper
            End If
         End If
         '设置连接的数量
         intCCount = CInt(lpcConnections)
         fcnRASEnumConnections = 0
      Case ERROR_BUFFER_TOO_SMALL
         '设置更大的缓冲区
         If lngWindowVersion = 2 Then
            'running NT
            intArraySize = lpcb / lprasconn(0).dwSize
         Else
            'running 95
            intArraySize = lpcb / lprasconn95(0).dwSize
         End If
      Case Else
         lngRASErrorNumber = lngRetCode
         strRASDescription = lpRASError.fcnRASErrorString()
         fcnRASEnumConnections = lngRetCode
   End Select
  
End Function

Public Function AddConnection(strNewEntryName As String, strNewPhoneNumber As String, strNewCallbackNumber As String, strNewUsername As String, strNewPassword As String, strNewDomain As String, boolAsync As Boolean) As Connection
'该函数的功能是建立拨号连接
'该函数返回一Connection对象
   Dim lngRetCode As Long
   Dim hRasConn As Long
   Dim lngRetlstrcpy As Long
   Dim intLooper As Integer
   Dim lngRetHangUp As Long
   
      '再vb中实现异步拨号,不过如果要直接实现异步拨号,要用到回调函数,而再vb中要实现回调函数比较困难
      '因此在调用RASDIAL函数的时候,可以传递一个模态对话框的句柄,然后通过RASGetConnectionStatus函数来
      '获取各种状态
      If lngWindowVersion = 2 Then
         'NT系统
         Dim lprasdialparams As RASDIALPARAMS
         lprasdialparams.dwSize = 736
         '最好使用函数lstrcpy,因为如果使用StrConv,可能失败
         lngRetlstrcpy = lstrcpy(lprasdialparams.szEntryName(0), strNewEntryName)
         lngRetlstrcpy = lstrcpy(lprasdialparams.szPhoneNumber(0), strNewPhoneNumber)
         lngRetlstrcpy = lstrcpy(lprasdialparams.szCallbackNumber(0), strNewCallbackNumber)
         lngRetlstrcpy = lstrcpy(lprasdialparams.szUserName(0), strNewUsername)
         lngRetlstrcpy = lstrcpy(lprasdialparams.szPassword(0), strNewPassword)
         lngRetlstrcpy = lstrcpy(lprasdialparams.szDomain(0), strNewDomain)
         '调用RASDial
         If boolAsync Then
            '异步调用同时忽略RASDIALEXTENSIONS
            '在参数传递是,其中一个是窗体的句柄
            Load frmAsyncDial
            lngRetCode = RasDial(ByVal APINULL, vbNullString, lprasdialparams, &HFFFFFFFF, frmAsyncDial.hWND, hRasConn)
         Else
            '同步拨号
            Screen.MousePointer = vbHourglass
            lngRetCode = RasDial(ByVal APINULL, vbNullString, lprasdialparams, APINULL, ByVal APINULL, hRasConn)
            Screen.MousePointer = vbDefault
         End If
         '判断是否成功
         If lngRetCode Then
            lngRASErrorNumber = lngRetCode
            strRASDescription = lpRASError.fcnRASErrorString()
            lngRetHangUp = RasHangUp(hRasConn)
            Err.Raise vbObjectError + lngRetCode, "Connections AddConnection Failed", "RAS Failure"
         Else
            '可以返回连接成功后的句柄
         End If
      Else
         '95/98系统 (lngWindowVersion =1)
         Dim lprasdialparams95 As RASDIALPARAMS95
         lprasdialparams95.dwSize = 1052
         lngRetlstrcpy = lstrcpy(lprasdialparams95.szEntryName(0), strNewEntryName)
         lngRetlstrcpy = lstrcpy(lprasdialparams95.szPhoneNumber(0), strNewPhoneNumber)
         lngRetlstrcpy = lstrcpy(lprasdialparams95.szCallbackNumber(0), strNewCallbackNumber)
         lngRetlstrcpy = lstrcpy(lprasdialparams95.szUserName(0), strNewUsername)
         lngRetlstrcpy = lstrcpy(lprasdialparams95.szPassword(0), strNewPassword)
         lngRetlstrcpy = lstrcpy(lprasdialparams95.szDomain(0), strNewDomain)
         '调用RASDial
         If boolAsync Then
            '异步调用
            '弹出对话框frmAsyncDial
            Load frmAsyncDial
            DoEvents
            lngRetCode = RasDial(ByVal APINULL, vbNullString, lprasdialparams95, &HFFFFFFFF, frmAsyncDial.hWND, hRasConn)
         Else
            '同步调用
            Screen.MousePointer = vbHourglass
            lngRetCode = RasDial(ByVal APINULL, vbNullString, lprasdialparams95, APINULL, ByVal APINULL, hRasConn)
            Screen.MousePointer = vbDefault
         End If
         '错误处理
         If lngRetCode Then
            lngRASErrorNumber = lngRetCode
            strRASDescription = lpRASError.fcnRASErrorString()
            lngRetHangUp = RasHangUp(hRasConn)
            Err.Raise vbObjectError + lngRetCode, "Connections AddConnection Failed", "RAS Failure"
         Else
            '调用成功
            DoEvents
         End If
      End If
      
      '可以在需要的时候返回连接句柄
      '或者可以遍历所有的连接,这样可以更准确地返回各个句柄
      If boolAsync Then
         frmAsyncDial.Tag = Hex$(hRasConn)
         frmAsyncDial.Show 1
      Else
         '如果是同步则不用处理
      End If
     '刷新活动连接
      lngRetCode = fcnRASEnumConnections()
      If lngRetCode Then Err.Raise vbObjectError + lngRetCode, "Connections AddConnection Failed", "RAS Failure"
      '循环获得每一个连接,如果其中一个连接等于最新建立地连接,则可以返回该连接
      '注意返回地是对象
      For intLooper = 0 To intCCount - 1
         If hRasConn = arrConnection(intLooper).hRasConn Then
            Set AddConnection = arrConnection(intLooper)
         Else
            Set AddConnection = Nothing
         End If
      Next intLooper
      
End Function

Public Sub RemoveConnection(lngIndexToRem As Long)
'删除一个连接
   Dim lngRetCode As Long
   Dim hRasConnToRem As Long
        
   '在删除以前,首先要获得句柄
   hRasConnToRem = arrConnection(lngIndexToRem).hRasConn
   
   '然后挂断该连接
   lngRetCode = RasHangUp(hRasConnToRem)
   If lngRetCode Then
         lngRASErrorNumber = lngRetCode
         strRASDescription = lpRASError.fcnRASErrorString()
         Err.Raise vbObjectError + lngRetCode, "Connections RemoveConnection Failed", "RAS Failure"
      Else
         '重新刷新活动连接
         lngRetCode = fcnRASEnumConnections()
         If lngRetCode Then Err.Raise vbObjectError + lngRetCode, "Connections RemoveConnection Failed", "RAS Failure"
   End If

End Sub

Private Sub Class_Initialize()

   Dim lngSuccess As Long
   
   '在初始化时获得所有活动连接
   lngSuccess = fcnRASEnumConnections()

End Sub

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?