Newsgroup: it.comp.programmare.win32
Titolo: Rilevare una connessione con VCL in BC++B1







Ciao sono Fabrizio.


 


Vorrei sapere quale è la procedura per 
rilevare una connessione usando VCL in Borland C++ Builder 1.


 


 


Grazie.







Ecco un codice di esempio, basato su 
threads.
//--------------------------------------------------------------------------
-
#include 
<vcl.h>
#include <ras.h>
#pragma hdrstop
#include 
"Ras.h"
#pragma 
package(smart_init)
//--------------------------------------------------------------------------
-
__fastcall 
TRasOn::TRasOn(bool 
CreateSuspended)
        : 
TThread(CreateSuspended)
{
  // Qui creo un oggetto di tipo TEvent 
(se non usi il C++ Builder, è
l'equivalente della API CreateEvent). Questo 
evento
  // segnalerà l'attivazione di una connessione 
RAS.
  RasOnEvent = new 
TEvent(NULL,true,false,"RAS_On_Event");
  // Resetto l'evento 
(l'equivalente API è ResetEvent) e chiamo l'API di cui
ti ho 
parlato.
  RasOnEvent->ResetEvent();
  
RasConnectionNotification(INVALID_HANDLE_VALUE,(void 
*)
RasOnEvent->Handle,RASCN_Connection);
  // Ti elenco i tre 
parametri. Specificando INVALID_HANDLE_VALUE, gli dico
di monitorare 
qualsiasi connessione RAS.
  // Gli passo l'handle dell'oggetto evento, 
e gli dico di monitorare
l'evento 
"Connessione".
}
//--------------------------------------------------------------------------
-
void 
__fastcall TRasOn::Execute()
{
   // Qui metto l'oggetto 
RasOn in fase di attesa, aspettando che una
connessione si attivi. Questo 
oggetto è ovviamente
   // contenuto in un thread.
  // 
l'API equivalente della seconda funzione è 
WaitForSingleObject
    
RasOnEvent->ResetEvent();
    
RasOnEvent->WaitFor(INFINITE);
    // codice da 
eseguire nel caso di avvenuta 
connessione
}
//--------------------------------------------------------------------------
-
__fastcall 
TRasOff::TRasOff(bool 
CreateSuspended)
        : 
TThread(CreateSuspended)
{
  // Qui è tutto identico al caso RasOn, 
solo che creo un oggetto evento per
la disconnessione.
  
RasOffEvent = new TEvent(NULL,true,false,"RAS_Off_Event");
  // 
Tutto uguale a sopra, cambia l'handle del secondo parametro (si
riferisce 
ovviamente al secondo oggetto evento), e gli
  // dico di monitorare 
l'evento "Disconnessione".
  RasOffEvent->ResetEvent();
  
RasConnectionNotification(INVALID_HANDLE_VALUE,(void 
*)
RasOffEvent->Handle,RASCN_Disconnection);
}
//--------------------------------------------------------------------------
-
void 
__fastcall TRasOff::Execute()
{
   // Aspetto che avvenga una 
disconnessione. Il thread è ovviamente diverso
da quello sopra, quindi ti 
servono due
   // thread per realizzare questo sistema 
(CreateThread è l'equivalente
API).
    
RasOffEvent->ResetEvent();
    
RasOffEvent->WaitFor(INFINITE);
}
Il file di include lo 
aggiungo, ma serve ovviamente solo se usi C++.
Dichiara i due 
thread.
//--------------------------------------------------------------------------
-
#ifndef 
RasH
#define 
RasH
//--------------------------------------------------------------------------
-
#include 
<Classes.hpp>
#include 
<Syncobjs.hpp>
//--------------------------------------------------------------------------
-
class 
TRasOn : public TThread
{
private:
  TEvent 
*RasOnEvent;
protected:
        void 
__fastcall Execute();
public:
        
__fastcall TRasOn(bool CreateSuspended);
};
class TRasOff : public 
TThread
{
private:
  TEvent 
*RasOffEvent;
protected:
        void 
__fastcall Execute();
public:
        
__fastcall TRasOff(bool 
CreateSuspended);
};
//--------------------------------------------------------------------------
-
#endif
Ricorda 
che questa soluzione non funziona con Win95. Se per un motivo o per
un altro 
non vuoi utilizzare i thread, l'unica chance che ti rimane è quella
di 
utilizzare un timer che ogni secondo o due chiama la RasGetConnectStatus.
Non 
te la consiglio.
Spero di esserti stato 
utile.