View Single Post
Old 15-02-2003, 13:32   #8
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Cittā: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Codice:
Const FILE_ATTRIBUTE_TEMPORARY = &H100
Const FILE_SHARE_READ = &H1
Const FILE_SHARE_WRITE = &H2
Const CREATE_NEW = 1
Const CREATE_ALWAYS = 2
Const OPEN_EXISTING = 3
Const GENERIC_READ = &H80000000
Const GENERIC_WRITE = &H40000000
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Any) As Long
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Any) As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
'La costante sotto la puoi cambiare per aumentare il numero masismo di byte
Const BYTE_PER_MSG = 16
'Serve solo per simualare l'invio
Private Sub Send(data As Byte)
    MsgBox "Byte: " + Str(Int(data))
End Sub

Private Sub SendMsg(num As Long, buf() As Byte)
    'Supponi di avere la tua sub che invia un byte alla volta e che si chiami Send
    'La prima cosa che bisogna fare č inviare la dimensione del pacchetto
    'Gli interi sono 4 byte e di conseguenza vanno scomposti in 4 pacchetti
    Dim tmp As Byte, I As Long
    tmp = (num And &HFF000000) / &H1000000
    Send tmp
    tmp = (num And &HFF0000) / &H10000
    Send tmp
    tmp = (num And &HFF00) / &H100
    Send tmp
    tmp = num And &HFF
    Send tmp
    'Per ricostruire il long basta fare in questo modo:
    'Dim num As Long, tmp As Byte
    'Recv tmp
    'num = Int(tmp) * &H1000000
    'Recv tmp
    'num = num + Int(tmp) * &H10000
    'Recv tmp
    'num = num + Int(tmp) * &H100
    'Recv tmp
    'num = num + Int(tmp)
    For I = 1 To num
        Send buf(I)
    Next I
End Sub

Private Sub Command1_Click()
    Dim buffer(BYTE_PER_MSG) As Byte, f As Long, read As Long
    f = CreateFile("nomefile.txt", GENERIC_READ, FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, 0, 0)
    If f = -1 Then
        MsgBox "Errore nell'apertura del file !!!"
    Else
        Do
            ReadFile f, buffer(1), BYTE_PER_MSG, read, ByVal 0&
            MsgBox "Byte letti: " + Str(read)
            'Ora richiamo la Sub che invia i dati
            SendMsg read, buffer
        Loop While read > 0
        CloseHandle f
    End If
End Sub
Crea un file nomefile.txt nella stessa directory del progetto...

Ricordati che il file č finito quando ricevi un pacchetto con contatore uguale a 0 (ed ovviamente 0 byte che lo seguono)...

Per creare un file in cui scrivere :
CreateFile(nomefile, GENERIC_WRITE, FILE_SHARE_READ, ByVal 0&, CREATE_ALWAYS, 0, 0)
Attento che sovrascrive i file giā esistenti...

Per scriverci WriteFile e funziona alla stesza maniera della ReadFile...
cionci č offline   Rispondi citando il messaggio o parte di esso