Condividi:        

VB2008 e dialup

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Anthony47, Triumph Of Steel, archimede

VB2008 e dialup

Postdi maxmula » 02/09/08 14:59

Ciao a tutti,
Sto scrivendo un programma in VB2008 che adun certo punto dovrebbe far partire una connessione dial-up

Su MSDN ho trovato le istruzioni per utilizzare delle chiamate a wininet.dll:

Codice: Seleziona tutto
Public Class CONNETTI

    Private Declare Function InternetGetConnectedState Lib "wininet.dll" (ByRef lpdwFlags As Int32, _
    ByVal dwReserved As Int32) As Boolean

    '--------------------------------------------------------------------------------------

    Private Declare Function InternetDial Lib "Wininet.dll" (ByVal hwndParent As IntPtr, _
    ByVal lpszConnectoid As String, ByVal dwFlags As Int32, ByRef lpdwConnection As Int32, _
    ByVal dwReserved As Int32) As Int32

    '--------------------------------------------------------------------------------------

    Private Declare Function InternetHangUp Lib "Wininet.dll" _
    (ByVal lpdwConnection As Int32, ByVal dwReserved As Int32) As Int32



    Private Enum Flags As Integer
        'Local system uses a LAN to connect to the Internet.
        INTERNET_CONNECTION_LAN = &H2
        'Local system uses a modem to connect to the Internet.
        INTERNET_CONNECTION_MODEM = &H1
        'Local system uses a proxy server to connect to the Internet.
        INTERNET_CONNECTION_PROXY = &H4
        'Local system has RAS installed.
        INTERNET_RAS_INSTALLED = &H10
    End Enum

    'Declaration Used For InternetDialUp.
    Private Enum DialUpOptions As Integer
        INTERNET_DIAL_UNATTENDED = &H8000
        INTERNET_DIAL_SHOW_OFFLINE = &H4000
        INTERNET_DIAL_FORCE_PROMPT = &H2000
    End Enum

    Private Const ERROR_SUCCESS = &H0
    Private Const ERROR_INVALID_PARAMETER = &H87


 [b]   Private mlConnection As Int32[/b]

(...)




Dopo tutta questa serie di Enum e Declare, si arriva all'istruzione per l'avvio della dial-up:

Codice: Seleziona tutto
DResult = InternetDial(Me.Handle, "Connessione_1", DialUpOptions. INTERNET_DIAL_FORCE_PROMPT, mlConnection, 0)


Dopodiché il programma esegue delle operazioni in rete (invia dei PING ad un server)

Altrove, nel mio codice, la dial-up viene terminata:

Codice: Seleziona tutto
       
 Result = InternetHangUp(mlConnection, 0&)



Ora, il mio problema è mlConnection...

Se eseguo il programmino d'esempio di MSDN va tutto a meraviglia, la connessione parte e poi viene chiusa... però mlConnection è sempre uguale a zero...

Io però prevedo di far partire almeno DUE dialup. immagino che dovrò usare due valori diversi, per poter chiudere solo quella che m'interessa.... Come li assegno? Posso decidere io oppure li si va a recuperare da qualche parte?

Grazie in anticipo...
MAx
Avatar utente
maxmula
Utente Senior
 
Post: 965
Iscritto il: 18/08/04 18:28
Località: N44°59'45 E09°00'34

Sponsor
 

Re: VB2008 e dialup

Postdi hydra » 03/09/08 10:44

Puoi postare il link da dove hai preso il codice? mlConnection cosa dovrebbe contenere? E poi, le connessioni che vuoi far partire tu devono essere avviate contemporaneamente oppure prima una e poi, una volta chiusa la prima, fai partire l'altra?
Avatar utente
hydra
Moderatore
 
Post: 7007
Iscritto il: 19/07/04 08:06
Località: Vallis Duplavis

Re: VB2008 e dialup

Postdi zello » 03/09/08 13:45

Ora, il mio problema è mlConnection...

Se eseguo il programmino d'esempio di MSDN va tutto a meraviglia, la connessione parte e poi viene chiusa... però mlConnection è sempre uguale a zero...

Io però prevedo di far partire almeno DUE dialup. immagino che dovrò usare due valori diversi, per poter chiudere solo quella che m'interessa.... Come li assegno? Posso decidere io oppure li si va a recuperare da qualche parte?

Il quarto parametro di InternetDial è un parametro di output che conterrà l'handle della connessione. Per intenderci, in C passi un puntatore (immagino che il ByRef nella dichiarazione indichi la stessa cosa in Visual Basic).
Tu non devi impostare alcunché, è Windows che - dopo aver chiamato la funzione - ti dà l'handle. Tu chiami InternetDial, e ti trovi in mlConnection l'handle della connessione.
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...
Avatar utente
zello
Moderatore
 
Post: 2351
Iscritto il: 06/05/02 13:44

Re: VB2008 e dialup

Postdi maxmula » 03/09/08 13:59

Ho risolto stamattina...

Avevo visto male: mlconnection è un identificativo della dialup ed assume un valore diverso da zero dopo che la funzione InternetDial ha avuto successo.
Bastava mettere un breakpoint al posto giusto... :)

Comunque il codice l'ho preso da qui:
http://support.microsoft.com/kb/821770/it

Le dialup partono contemporaneamente (in processi separati, una per processo); ognuna di esse viene avviata e chiusa un numero prefissato di volte. Durante ogni sessione vengono lanciati comandi PING o FTP per un numero di volte a scelta dell'utente (lo scopo del programma è generare traffico di segnalazione & dati attraverso un SGSN (Serving GPRS Support Node).

Grazie comunque per la pazienza!
MAx
Avatar utente
maxmula
Utente Senior
 
Post: 965
Iscritto il: 18/08/04 18:28
Località: N44°59'45 E09°00'34

Re: VB2008 e dialup

Postdi maxmula » 08/09/08 17:30

Risolto il primo problema... eccone un altro: far partire DUE dialup contemporaneamente...

In pratica il programma funziona così: c'è un eseguibile a cui vengono passati i parametri della dialup da aprire (nome della dialup, quante volte lanciarla ed arrestarla, indirizzo da contattare).

- lancio il programma la prima volta e la dialup desiderata si apre
- dopo l'apertura della connessione, il programma fa un ROUTE ADD in modo da associare l'indirizzo da raggiungere al gateway assegnato, ed inizia a PINGare... e fin qui funziona tutto

- Mentre la prima dialup è aperta, lancio il programma un'altra volta, con parametri diversi (la dialup richiesta è configurata per usare un modem diverso dal primo). A questo punto, mentre prima mlconnection era diverso da zero, ora mi rimane mlconnection=0 e Result=0 (il che dovrebbe indicare che non ci sono stati problemi di apertura connessione). il ROUTE ADD fallisce perchè il gateway non è valido (giustamente...) ed il ping cerca di utilizzare la scheda di rete del PC anziché il mio modem (l'indirizzo che cerco di aggiungere è diverso dal primo).

Si direbbe che per qualche motivo il sistema trovi una dialup aperta e dica: "OK, sei connesso!"...

Naturalmente, se lancio tutte le dialup e faccio ROUTE ADD a manina, funziona correttamente!

Mi sa che brancolo nel buio... ogi consiglio è bene accetto! :undecided:
Avatar utente
maxmula
Utente Senior
 
Post: 965
Iscritto il: 18/08/04 18:28
Località: N44°59'45 E09°00'34

Re: VB2008 e dialup

Postdi zello » 09/09/08 07:45

eccone un altro: far partire DUE dialup contemporaneamente

Non è un problema di difficile soluzione. Semplicemente, per quanto ho letto in giro, non si può - almeno usando InternetDial.
Già la pagina linkata prima di msdn dice che:
InternetDial does not support double-dial connections

Ho trovato qualcuno nei newsgroups che lamentava problemi come i tuoi, senza alcuna soluzione. Mi sa che la cosa non è banale, ma fossi in te tirerei un occhio alle funzioni RAS che forse sono un po' più flessibili.
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...
Avatar utente
zello
Moderatore
 
Post: 2351
Iscritto il: 06/05/02 13:44

Re: VB2008 e dialup

Postdi maxmula » 09/09/08 23:56

InternetDial does not support double-dial connections

mmm.... questa mi era sfuggita...

Comunque oggi ho fatto un po' di indagini: in \Windows\System32 ci sono i 2 eseguibili Rasphone.exe e Rasdial.exe.

Rasphone fa comparire la classica finestra di dialup (su cui bisogna cliccare)... mentre rasdial sembra fare al caso mio.

Sintassi:
Codice: Seleziona tutto
rasdial

Senza parametri, elenca le connessioni attualmente attive.

Codice: Seleziona tutto
rasdial nome_connessione

fa partire la dialup con nome=nome_connessione (ovviamente deve già esistere, ma x me nn è un problema :) )

Codice: Seleziona tutto
rasdial nome_connessione /disconnect

...ovviamente arresta la dialup in questione.

L'ho provato lanciandolo a mano ed ha funzionato ma non sono riuscito ad implementarlo per motivi di tempo... domani però provo a chiamarlo con una funzione (che ho già scritto) che lancia comandi di sistema (è la stessa che uso per fare ROUTE ADD)...


Ciao e grazie,
Max
Avatar utente
maxmula
Utente Senior
 
Post: 965
Iscritto il: 18/08/04 18:28
Località: N44°59'45 E09°00'34

Re: VB2008 e dialup

Postdi maxmula » 11/09/08 16:11

...In effetti ora ho risolto. Posto il codice x completezza.
Alla base di tutto c'è questa funzione, che invia comandi di S.O. dall'applicazione VB:

Codice: Seleziona tutto
Function SYSTEM_COMMAND(ByVal COMANDO As String, ByVal PARAMETRO As String)
        'INVIA COMANDO
        Dim myProcess As New Process()
        Dim RISPOSTA As String
        'Dim A As String

        RISPOSTA = ""

        myProcess.StartInfo.UseShellExecute = False
        myProcess.StartInfo.RedirectStandardOutput = True
        Try
            myProcess.StartInfo.FileName = COMANDO
            myProcess.StartInfo.Arguments = PARAMETRO
            myProcess.StartInfo.CreateNoWindow = True
            myProcess.Start()
            RISPOSTA = Replace(myProcess.StandardOutput.ReadToEnd(), _
               Chr(13) & Chr(13), Chr(13))
            myProcess.WaitForExit()
            'Catch ex As System.Win32Exception
            '   MsgBox((ex.Message + ". Error Detected."))
        Catch

        End Try

        Return RISPOSTA
    End Function


Per lanciare la dialup, uso:
Codice: Seleziona tutto
(...)
    RASDIAL = SYSTEM_COMMAND("RASDIAL", ID_DIALUP)
    RAS_ERROR = InStr(UCase(RASDIAL), "ERROR")  '

(...)


Dove ID_DIALUP è una stringa che contiene il nome della dialup da lanciare (che deve esistere già nel menu Connessioni di Rete di Windows).
Se tutto va a buon fine, RAS_ERROR = 0

Per arrestare la dialup, stessa cosa:
Codice: Seleziona tutto
   RASDIAL = SYSTEM_COMMAND("RASDIAL", ID_DIALUP & " /DISCONNECT")  'con lo spazio prima del segno /
    RAS_ERROR = InStr(UCase(RASDIAL), "ERROR")


In questo modo sono riuscito a lanciare 3 sessioni contemporanee senza problemi. Appena trovo qualche server "pingabile" provo ad aumentare il numero.

Come al solito, il vero problema era sapere dove guardare... :)

Alla prossima,
MAx
Avatar utente
maxmula
Utente Senior
 
Post: 965
Iscritto il: 18/08/04 18:28
Località: N44°59'45 E09°00'34


Torna a Programmazione


Topic correlati a "VB2008 e dialup":

Consiglio libro vb2008.
Autore: malcomx73
Forum: Programmazione
Risposte: 3

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti

cron