|
|
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í.