Desconectando-se da Internet

Compartilhar/Favoritos

Um exemplo de como se desconectar da Internet mesmo quando a conexão for feita por outro programa. Esse exemplo permite que você liste as conexões atuais usando RAS (Remote Access Service).

Este é de um grupo de posts muito antigos, de 2002. Vêm do meu antigo site, quando ainda trabalhava com Delphi e tinha um K6-2(!!!!). Bons tempos aqueles…

Provavelmente não serve para muita coisa hoje, mas é legal ver como as coisas eram. Além disso, ainda há gente acessando!

No post Conectando-se à Internet, eu expliquei um pouco sobre como se conectar e desconectar da Internet, além de saber se o computador está ou não conectado.

No entanto, uma coisa ainda ficou em aberto: como se desconectar da Internet quando a conexão for feita por outro programa?

A função InternetDial da WinInet (explicada no referido artigo) retorna um handle para a conexão. Esse handle pode ser usado na função InternetHangup para nos desconectarmos. Entretanto, não temos esse handle quando a conexão for feita por outro programa (o próprio Internet Explorer, por exemplo).

Para solucionarmos esse problema, podemos usar as funções RAS (Remote Access Service) disponíveis no Windows 95. Essas funções são usadas internamente pela DLL WinInet e são um pouco mais complicadas do que as funções de WinInet. Por isso vou explicar só o que interessa.

Requisitos

Para usar as funções RAS, você deve ter as unidades correspondentes aos headers das funções RAS traduzidos para Delphi. O Delphi 6 não disponibiliza nenhuma unidade com as funções RAS.

Eu utilizei os headers criados pelo Project Jedi, que podem ser pegos no endereço ftp://delphi-jedi.org/api/RAS.zip.

Depois de pegar o arquivo do Project Jedi, descompacte-o em qualquer lugar e inclua os caminhos Pas, Demos e Utils (você os verá na pasta na qual os arquivos descompactados forem criados) no Search Path do seu projeto (no menu Project|Options guia Directories/Conditionals campo Search Path).

Detectando e desconectando

O código abaixo utiliza a função RasEnumConnections que lista todas as conexões abertas pelo sistema RAS, incluindo aquelas feitas por MODEM, Frame Relay, ISDN, Atm, entre outras. Por isso verifico qual das conexões usa o MODEM e desconecto só ela.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// As unidades em "uses" devem ter sido pegas do PROJECT JEDI.
uses Ras, LmErr;
 
procedure Error(Code: Cardinal);
begin
  raise Exception.Create('Erro: ' + IntToStr(Code));
end;
 
procedure Desconecta;
var
  Cons, TempConn: PRasConn;
  BufSize, ConnCount, Res: DWORD;
  I: Integer;
begin
  Cons := AllocMem(SizeOf(TRasConn));
  try
    PRasConn(Cons).dwSize := SizeOf(TRasConn);
    BufSize := SizeOf(TRasConn);
    // Pegando a lista de uma conexão só.
    Res := RasEnumConnections(Cons, BufSize, ConnCount);
    // Se tiver mais de uma conexão, vamos tentar mudar o tamanho do 
    // buffer para pegar todas.
    if Res = NERR_BufTooSmall then begin
      ReallocMem(Cons, BufSize);
      Res := RasEnumConnections(Cons, BufSize, ConnCount);
      if Res <> 0 then Error(Res);
    end else
      if Res <> 0 then Error(Res);
    if Res = 0 then begin
      TempConn := Cons;
      for I := 0 to ConnCount - 1 do begin
        if TempConn.szDeviceType = RASDT_Modem then begin
          // Desconectando-se...
          RasHangUp(TempConn.hrasconn);
		  BREAK;
        end;
        Inc(PChar(TempConn), TempConn.dwSize);
      end;
    end else
      Error(Res);
  finally
    FreeMem(Cons);
  end;
end;

Para saber mais sobre as funções RasEnumConnections e RasHangup, veja o help Windows SDK no menu Help do Delphi.

You may also like...

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Translate »