Newsgroup: it.comp.lang.visual-basic
Titolo: Lettura floppy con formattazione non "standard" indicata da Hal

Gentili amici, ho già postato tempo addietro il problema e la soluzione
indicata da Hal sembra buona... ha funzionato 1 volta, ma non so poi cosa ho
toccato che non la fa più funzionare. Colpa dell'inesperienza.
Chiedo dunque la vostra assistenza. Il problema è questo:
SO W2000, devo leggere in particolari settori di un floppy con la seguente
formattazione...
        2 testine
        1 blocco = 4 settori
        640 blocchi
        16 sett./traccia
        256 byte/settore
Il codice indicatomi da Hal è il seguente (Input: drive_letter "A:"; head,
sector, track sono i punti da cui inizia la lettura; numsec è il numero di
settori da leggere; sectors_per_track, num_of_heads, bytes_per_sector sono i
parametri della formattazione; ret_Sectors è l'array dei byte che sono stati
letti; La funzione restituisce il n° di bytes letti):
----------------------------------------------------------------------------
-----------------------
Public Function GetSectors(ByVal drive_letter As String, _
                        ByVal head As Long, ByVal sector As Long, _
                        ByVal track As Long, ByVal numsec As Long, _
                        ByVal sectors_per_track As Long, _
                        ByVal num_of_heads As Long, _
                        ByVal bytes_per_sector As Long, _
                        ByRef retSectors() As Byte _
        ) As Long
Dim LogicalSector   As Long     '// settore logico corrispondente a H/T/S
Dim hDevice         As Long     '// handle al disco
Dim bytesRead       As Long
'// cerchiamo di ottenere l' handle al disco
hDevice = CreateFile("\\.\A:", _
                GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, _
                ByVal 0&, OPEN_EXISTING, ByVal 0&, ByVal 0&)
If (0 = hDevice) Then Exit Function     '// abbiamo sbagliato qualcosa
'// calcoliamo il settore logico
LogicalSector = (sector - 1) + (head * sectors_per_track) + _
                        (track * sectors_per_track * num_of_heads)
'// dimensioniamo il buffer che ospiterà il contenuto dei settori da leggere
ReDim retSectors(0 To bytes_per_sector * numsec)
'// puntiamo all' inizio del settore da leggere
Call SetFilePointer(hDevice, _
                 (LogicalSector * bytes_per_sector), _
                 ByVal 0&, _
                 FILE_BEGIN)
'// finalmente leggiamo i settori
If (ReadFile(hDevice, retSectors(0), bytes_per_sector * numsec, bytesRead,
ByVal 0&)) Then
    '// restituiamo il numero di byte letti
    GetSectors = bytesRead
End If
CloseHandle (hDevice)
End Function    '// GetSectors
----------------------------------------------------------------------------
-------------------------------
Il problema lo ho  isolato nella funzione ReadFile. Infatti in debug tutto
fila liscio fino all'Istruzione if ReadFile(...) then che mi restituisce 0
(è 0 anche il valore di bytesRead).
La funzione è stata definita in un modulo così:
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
Io non ne so venire a capo, perchè non funziona il ReadFile? C'è qualcuno
tra voi che è così esperto e gentile da indicarmi l'errore?
Grazie a tutti.

 lpOverlapped As Any) As Long
e quindi la func restituisce un valore long , quindi la IF non ha senso a
meno che non si tratti di 1 o 0  e allora viene interpretato come bool , in
pratica non dovrebbe essere esplicitata in :
If (ReadFile(hDevice, retSectors(0), bytes_per_sector * numsec, bytesRead,
ByVal 0&) = / <> da qualcosa ) Then ....


Grazie per il tentativo, ma non è come dici... sembrerebbe che il valore
true non è restituito dal solo valore 1 ma da un qualunque valore
(quantomeno positivo) diverso da 0.
Infatti prova a copiare il  seguente codice e controlla...
    if 364 then msgbox("Valore positivo = true")
    if 0 then msgbox("Ci scrivo ciò che voglio tanto non lo leggo")
Ciao........

     if 0 then msgbox("Ci scrivo ciň che voglio tanto non lo leggo")
non si finisce mai di imparare ( spece per me che so all'inizio )