Private Const Bit31 As Currency = 2147483647@
Private Const Bit32 As Currency = 4294967295@
Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
Private Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long
Private Function GetFileSizeEx(ByVal hFile As Long) As Currency
Dim lLow As Long
Dim lHigh As Long
lLow = GetFileSize(hFile, lHigh)
Call ToLargeInt(GetFileSizeEx, lLow, lHigh)
End Function
Private Function SetFilePointerEx(ByVal hFile As Long, ByVal lDistanceToMove As Currency, ByVal dwMoveMethod As Long) As Currency
Dim lLow As Long
Dim lHigh As Long
Call FromLargeInt(lDistanceToMove, lLow, lHigh)
lLow = SetFilePointer(hFile, lLow, lHigh, dwMoveMethod)
Call ToLargeInt(SetFilePointerEx, lLow, lHigh)
End Function
Private Sub FromLargeInt(ByVal cLargeInt As Currency, ByRef lLow As Long, ByRef lHigh As Long)
Do Until cLargeInt < Bit32
lHigh = lHigh + 1
cLargeInt = cLargeInt - Bit32
Loop
If cLargeInt > Bit31 Then
lLow = -CLng(Bit32 - (cLargeInt - 1))
Else
lLow = CLng(cLargeInt)
End If
End Sub
Private Sub ToLargeInt(ByRef cLargeInt As Currency, ByVal lLow As Long, ByVal lHigh As Long)
cLargeInt = Bit32 * lHigh
If lLow < 0 Then
cLargeInt = cLargeInt + (Bit32 + (lLow + 1))
Else
cLargeInt = cLargeInt + lLow
End If
End Sub