htm=articulo/rasapi.htm ok articulo/rasapi.htm

Acceso telefónico a redes.

La librería RASAPI32.DLL proporciona funciones para el manejo completo del acceso telefónico a redes. En este artículo se describe el modo más simple en el que se puede usar esta DLL realizando una conexion en modo síncrono (el ejemplo se ha realizado en VB4).


El modo más correcto de realizar una conexion a internet por medio del acceso telefónico a redes, implica el uso de una funcion asíncrona que envía mensajes a una funcion callback. Resulta prácticamente imprescindible realizarlo así porque la negociacion de los modems emplea casi veinte segundos, y usando una funcion síncrona nuestra aplicacion se queda como muerta, dando la impresion de que se ha colgado el ordenador.

La realizacion de una conexion asíncrona tiene sus dificultades, sobre todo si pretendemos usar VB4, que no permite funciones calback. Este artículo describe cómo se puede realizar una conexion síncrona e incluye un ejemplo en VB4. Esto no es adecuado para una aplicacion con apariencia profesional, pero puede ser suficiente para nuestra pequeñas aplicaciones. El inconveniente mencionado antes (la aplicacion queda muerta durante veinte segundos), se puede solucionar ocultando la ventana de la aplicacion antes de realizar la conexion o se puede ignorar, porque ya sabemos que en el fondo no es problema (aunque cause mal efecto).

El acceso telefónico a redes usa "entradas" para definir los parámetros de cada conexion. Las entradas definidas son visibles como iconos en la carpeta del acceso telefónico a redes, además en esa misma carpeta hay otro icono que sirve para crear nuevas entradas.

Para conectar se emplea la funcion RasDial a la cual se le pasa una estructura RASDIALPARAMS que incluye el nombre de la entrada del acceso telefónico a redes, el nombre de usuario y la password. Todos los demás parámetros que definen la conexion (numero de telefóno, servidor de nombre, protocolo, ...) deben estar definido en la entrada que se va a usar. Sin embargo el nombre de usuario y la password se la daremos desde el programa, sin usar la que tuviera previamente definida.

La declaracion de las apis que vamos a usar es la siguiente:

Private Type RASDIALPARAMS
   dwSize As Long
   szEntryName As String * 257
   szPhoneNumber As String * 129
   szCallbackNumber As String * 129
   szUserName As String * 257
   szPassword As String * 257
   szDomain As String * 16
   filler As String * 16
End Type
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal miliseg As Long)
Private Declare Sub strcpyn Lib "kernel32.dll" Alias "lstrcpynA" (ByVal a As String, ByVal de As String, ByVal n As Long)
Private Declare Function strlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal texto As String) As Long
Private Declare Function RasHangUp Lib "rasapi32.dll" Alias "RasHangUpA" (ByVal handle As Long) As Integer
Private Declare Function RasDial Lib "rasapi32.dll" Alias "RasDialA" (ByVal p1 As Long, ByVal p2 As Long, rd As RASDIALPARAMS, ByVal p4 As Long, ByVal p5 As Long, handle As Long) As Integer
Private Declare Sub RasGetErrorString Lib "rasapi32.dll" Alias "RasGetErrorStringA" (ByVal nmumer As Long, ByVal buffer As String, ByVal sizebuf As Long)

Implementamos funciones para conectar, desconectar y tratar errores usando las apis anteriores. Tambien creamos una variable global (el handle de la conexion) porque suponemos que no se va a trabajar con más de una conexion a un tiempo.

'##################
Dim hDial As Long 'handle de la conexion
'##################

Function Conectar(entry As String, user As String, pass As String) As Integer
  Dim rdp As RASDIALPARAMS
  rdp.dwSize = 1052
  strcpyn rdp.szEntryName, entry + Chr$(0), 256
  strcpyn rdp.szPhoneNumber, Chr$(0), 128
  strcpyn rdp.szCallbackNumber, Chr$(0), 128
  strcpyn rdp.szUserName, user + Chr$(0), 256
  strcpyn rdp.szPassword, pass + Chr$(0), 256
  strcpyn rdp.szDomain, Chr$(0), 15
  Conectar = RasDial(0, 0, rdp, 0, 0, hDial)
End Function

Function Desconectar() As Long
  Dim n As Long
  If hDial <> 0 Then
    n = RasHangUp(hDial)
    If n = 0 Then
      hDial = 0
      Sleep (3000)
    End If
  End If
  Desconectar = n
End Function

Function TextoError(num As Long) As String
  Dim txt As String * 128
  txt = Chr$(0)
  RasGetErrorString num, txt, 127
  TextoError = Left$(txt, strlen(txt))
End Function

El uso de estas funciones es bastante evidente. No necesitamos tratar directamente con las apis, sino que usaremos las tres funciones definidas. El ejemplo que se acompaña, en VB4, muestra una ventana con dos botones, uno para conectar y otro para desconectar. Los nombres de entrada, username y password se toman de sendos textbox. Se usa un label para mostrar el estado de la conexion.

Private Sub Command1_Click()
  Dim n As Long
  If hDial <> 0 Then
    Label1 = "Ya estaba conectado"
    Exit Sub
  End If
  n = Conectar(Text1, Text2, Text3)
  If n = 0 Then
    Label1 = "Conectado"
  Else
    Label1 = TextoError(n)
  End If
End Sub

Private Sub Command2_Click()
  Dim n As Long
  If hDial = 0 Then
    Label1 = "No estaba conectado"
    Exit Sub
  End If
  n = Desconectar
  If n = 0 Then
    Label1 = "Desconectado"
  Else
    Label1 = TextoError(n)
  End If
End Sub

El ejemplo completo se puede descargar haciendo click aquí.


© info3@maicas.net