|
|
|
![]() |
|
Strumenti |
![]() |
#61 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Il numero 134 è in binario 128+4+2...cioè 01 00 01 10... Faccio l'and con 11 00 00 00 ed ottengo 01 00 00 00 che in decimale è 128 ma a me interessa avere il valore della cifra rappresentata da quei due bit (nel caso del messaggio il valore dell'ultimo byte) e per ottenerlo posso shiftare a destra di 6 bit ed ottengo che i due bit più significativi valgono 1 (per la rpecisione 01)... |
|
![]() |
![]() |
![]() |
#62 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Si ora è veramente chiaro . Toglimi una curiosità : le funzioni ReadFile,WriteFile sono tipizzate e ritornano tutte un valore Long . Come mai per esempio il valore long non viene utilizzato nel codice ad eccezione della CreateFile . Mi è capitato spesso in C++ di realizzare funzioni tipizzate . Il loro valore doveva per forza essere contenuto in una variaible . Non potevo cioè riciamarle come delle funzioni atipizzate (void) . Perché in VB questo è possibile ?
|
![]() |
![]() |
![]() |
#63 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
![]() int f(int a) { .... } Si può tranquillamente richiamare: f(a); senza usarne il risultato... |
|
![]() |
![]() |
![]() |
#64 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
veramente ? lo sai che non lo sapevo ?
|
![]() |
![]() |
![]() |
#65 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Nella chat che sto realizzando scambio messaggi di testo senza alcun problema : ora voglio inserire un menù che chiamo "Invia file" . Quando ci clicco si apre la finestra di dialogo che mi fa selezionare il file da inviare . Io lo seleziono e con tutte quelle procedure invio e ricevo il file . Il problema è : Come faccio a far capire all'altra applicazione che i dati che gli giungeranno sono i byte del file e non messaggi di testo ? Avevo pensato ad un identificatore per esempio "-99999999" . Quando riceve questo messaggio attiva la procedura di ricezione del file . Che ne pensi ?
|
![]() |
![]() |
![]() |
#66 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Fai così...il numero di byte del messaggio invece di metterlo su un Long lo metti su un Integer (16 bit)...
Se lo metti a 16 bit devi togliere le due conversioni per i byte più alti... tmp fallo di 3 invece di 4 e sul primo Byte ci metti un byte di controllo... SendMsg diventerà così: Codice:
Private Sub SendMsg(cmd As Byte, num As Integer, buf() As Byte) Dim tmp(3) As Byte Dim v As Variant tmp(1) = cmd tmp(2) = (num And &HFF00) / &H100 tmp(3) = num And &HFF Const FILE_NAME &H04 Indica che ilpacchetto contiene un nome di un file (ad esempio per trasferire un file dall'altra parte e dargli lo stesso nome che dalla parte di chi lo manda) Const FILE_DATA &H02 Indica che il pacchetto contiene i dati di un file Const TEXT_DATA &H01 Indica che il pacchetto contiene i dati di un messaggio di testo Const END_OF_DATA &H08 Questo può servire sia per indicare la fine di un nome di file, dei dati di un file e di un messaggio di testo Const END_OF_CONNECTION &H80 Questo ti può servire per fare la disconnessione...magari l'altro PC dovrà risponderti con un altro apcchetto di END_OF_CONNECTION Ad esempio l'invio del file diventerà così : Codice:
Do ReadFile f, buffer(1), BYTE_PER_MSG, read, ByVal 0& 'Ora richiamo la Sub che invia i dati If read < BYTE_PER_MSG Then SendMsg read, buffer, FILE_DATA Or END_OF_DATA Else SendMsg read, buffer, FILE_DATA End If Loop Until read < BYTE_PER_MSG CloseHandle f |
![]() |
![]() |
![]() |
#67 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Durante la ricezione...per testare se hai un tipo o un altro di dati basta fare :
Codice:
If (tmp(1) And FILE_NAME) > 0 Then ... ElseIf (tmp(1) And TEXT_DATA) > 0 Then ... End If 'Per testare l'END_OF_DATA usi lo stesso metodo |
![]() |
![]() |
![]() |
#68 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Ora faccio una cosa . Siccome ho creato un progetto a parte per il solo invio del file , domani a scuola lo provo . Se funziona e non mi dà alcun problema allora passo alla parte riguardante quelle costanti . Ah ... una cosa .... ma quelle costanti li definisco io o già esistono ?
|
![]() |
![]() |
![]() |
#69 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Nono...le definisci te...
E' importante che ognuna rappresenti un bit del byte cmd... Ah...aspetta...in SendMsg ho messo in cima cmd, mentre quando l'ho usato l'ho messo in fondo... |
![]() |
![]() |
![]() |
#70 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Si me ne sono accorto ma non ti preoccupare
|
![]() |
![]() |
![]() |
#71 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Insomma, in poche parole ampliando il numero di byte per cmd puoi farci qualsiasi cosa... Come ad esempio controllare un PC in remoto...ricevere la lista delle directory...la lista dei file nelle directory...cambiare directory remota e qualsiasi altra cosa che ti viene in mente
![]() |
![]() |
![]() |
![]() |
#72 | |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Quote:
|
|
![]() |
![]() |
![]() |
#73 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Andiamo per gradi...
Metti che cmd sia un integer e non un byte... Puoi definire altre costanti (fino a 16)... Ad esempio puoi definire altre costanti DIR_LIST_QUERY, DIR_LIST_RESPONSE e un altra che genera una condizione di errore (significa che il ricevente non può eseguire il comando inviato) che chiamo CMD_ERROR... SendMsg 9, "C:\CICCIO", DIR_LIST_QUERY Or END_OF_DATA Mettiamo che nel disco C: ci siano 3 directory: PIPPO, PLUTO, TOPOLINO. Il ricevente con un ciclo risponderà con una serie di messaggi contenti le varie directory: SendMsg 5, "Pippo", DIR_LIST_RESPONSE SendMsg 5, "Pluto", DIR_LIST_RESPONSE SendMsg 8, "Topolino", DIR_LIST_RESPONSE Or END_OF_DATA Poi se definisci anche FILE_LIST_QUERY e FILE_LIST_RESPONSE: SendMsg 9, "C:\CICCIO", DIR_LIST_QUERY Or END_OF_DATA Ed ovviamente il ricevente risponderà con i file contenuti nella directory Ciccio... Poi chi più ne ha più ne metta... Cancellare i file...copiarli in un'altra posizione...rinominarli (si può usare anche la copia non c'è bisogno di ridefinire altre costanti)... |
![]() |
![]() |
![]() |
#74 | |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Quote:
|
|
![]() |
![]() |
![]() |
#75 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Cmd lo puoi ampliare a tuo piacere....e a tuo piacere puoi definire anche quelle costanti...
END_OF_DATA abbiamo detto che significa che il messaggio corrente è l'ultimo della serie... Mettere un Or significa che quando fai il test con l'And per verificare se una costante è settata (in qualche messaggio sopra ti avevo detto che per fare i test per vedere se una costante è settata bisogna fare un OR, ma avevo sbagliot a scrivere...ci vuole l'And) ti rende un numero > zero (questo perchè abbiamo detto che ogni costante è un bit distinto di cmd)... Nota che questo è il metodo che usano praticamente tutte le funzioni delle API di Windows... Ad esempio in CreateFile se volevi che il file aperto potesse essere sia letto che scritto da altri mentre è aperto da te basta mettere FILE_SHARE_WRITE Or FILE_SHARE_READ... Oppure se vuoi aprire un file sia in lettura che in scrittura basta combinare le due opzioni GENERIC_READ e GENERIC_WRITE con l'Or... In pratica usando l'Or setti a 1 il bit di cmd corrispondente alla costante usata... |
![]() |
![]() |
![]() |
#76 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Inizio a non capirci più . Forse perché ho passato tutto il giorno a capire il resto .
|
![]() |
![]() |
![]() |
#77 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Allora stamattina ho provato ma sfortunatamente ecco presentarsi i problemi . Quando dichiaro la matrice tmp(4) , dopo mi impedisce di fare :
MSCOMM1.output = tmp . Ed anche quando leggo , facendo tmp = MSCOMM1.input mi da problemi . Come si può ovviare ? |
![]() |
![]() |
![]() |
#78 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Come avevo fatto io...devi assegnare tmp ad un variant...e poi il variant alla output...
Stessa cosa per la input... |
![]() |
![]() |
![]() |
#79 | |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Quote:
|
|
![]() |
![]() |
![]() |
#80 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Sinceramente non lo so, prova ad assegnare il variant a tmp...
Semplicemente tmp = v... |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:15.