Мне нужно использовать функцию SetFilePointer в kernel32, чтобы прочитать сектор диска, чей адрес содержится в двойном символе для определения размера.Я знаю, что функция ReadFile принимает loword как long и hiword как long параметры, но я не мог разделить свой двойной адрес на два слова.
Я пробовал несколько методов, используя Mod и Fix, но в конце концов ябыли только ошибки переполнения.
LoWord = CLng(dNum Mod CDbl(4294967295)) 'Dont care the number I use, I always get overflow error
или
LoWord = CLng(FMod(dNum, 4294967295#))
HiWord = CLng(dNum - (FMod(dNum, 4294967295#))) 'tryed different number to see the behaviour, don't care
где
Public Function FMod(a As Double, b As Double) As Double
FMod = a - Fix(a / b) * b
'http://en.wikipedia.org/wiki/Machine_epsilon
'Unfortunately, this function can only be accurate when `a / b` is outside [-2.22E-16,+2.22E-16]
'Without this correction, FMod(.66, .06) = 5.55111512312578E-17 when it should be 0
If FMod >= -2 ^ -52 And FMod <= 2 ^ -52 Then '+/- 2.22E-16
FMod = 0
End If
End Function
Я пытался преобразовать double в byteArray или шестнадцатеричную строку, чтобы попробовать "руководство""сдвиг байтов, но безуспешно.
Я уже вижу Преобразование двойного в 8-байтовый массив , но образец без модификации всегда преобразует dNum = 1 в [0, 0, 0, 0, 0, 0, 240, 63] как результат, и он не кажется правильным.
У вас есть какой-нибудь совет или какой-то другой способ чтения секторов с большим адресом с диска в VB6?
Спасибо всем за чтение моего вопроса.
Чтобы лучше уточнить, что я делаю: я знаю, что, возможно, vb6 не лучший выбор, но теперь я начал с этого... Я прочитал номер сектора из INI-файла (является переменным) в шестнадцатеричном формате (как STкольцо), которое я конвертирую в Long (но должен ли он переноситься в два раза или как?), учитывая 512 байт на сектор.Количество байтов, которые я должен прочитать с диска, начиная с этого сектора, является постоянным.
Когда я использую функцию
Call SetFilePointer(hDevice, iStartSec * BytesPerSector, 0, FILE_BEGIN)
, мне нужно указать количество байтови затем я должен умножить на 512. Это вызывает у меня переполнение, которое я пытаюсь обойти.
Я пробовал также этот метод:
Private Type TKK_Dbl
Value As Double
End Type
Private Type Dbl2Long
LowVal As Long
HighVal As Long
End Type
Private D As TKK_Dbl
Private L As Dbl2Long
в функции ...
D.Value = CDbl(iStartSec) * CDbl(BytesPerSector)
LSet L = D
Call SetFilePointer(hDevice, L.LowVal, L.HighVal, FILE_BEGIN)
Но у меня это не сработало.