Option Explicit
Public Const MOVEFILE_REPLACE_EXISTING = &H1
Public Const FILE_ATTRIBUTE_TEMPORARY = &H100
Public Const FILE_BEGIN = 0
Public Const FILE_SHARE_READ = &H1
Public Const FILE_SHARE_WRITE = &H2
Public Const CREATE_NEW = 1
Public Const OPEN_EXISTING = 3
Public Const GENERIC_READ = &H80000000
Public Const GENERIC_WRITE = &H40000000
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public 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
Public Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As Long
Public 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
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
Public Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long
Public Declare Function SetEndOfFile Lib "kernel32" (ByVal hFile As Long) As Long
' 32 bit
'signed int
'1000 0000 0000 0000 0000 0000 0000 0000
' =
'8000 0000 -> -2147483648
'
'0111 1111 1111 1111 1111 1111 1111 1111
' =
'7FFF FFFF -> 0 ~ 2^31-1 2147483647
'
'unsigned int
'1111 1111 1111 1111 1111 1111 1111 1111
' =
'FFFF FFFF -> 0 ~ 2^32-1 4294967295
'
' 64 bit
'signed int
'1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
' =
'8000 0000 0000 0000 -> -9223372036854775808
'
'0111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111
' =
'7FFF FFFF FFFF FFFF -> 0 ~ 2^63-1 9223372036854775807
' VB Currency 922337203685477.5807
'
'unsigned int
'1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111
' =
'FFFF FFFF FFFF FFFF -> 0 ~ 2^64-1 18446744073709551615
Public Type LARGE_INTEGER
lowpart As Long
highpart As Long
End Type
Public Function Currency2LargeInteger(ByVal curDistance As Currency) As LARGE_INTEGER
CopyMemory Currency2LargeInteger, curDistance, 8
End Function
Public Function LargeInteger2Currency(li As LARGE_INTEGER) As Currency
CopyMemory LargeInteger2Currency, li, 8
End Function
Public Function MyOpen(ByVal sFileName As String) As Long
MyOpen = CreateFile(sFileName, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0, 0)
End Function
Public Function MySeek(ByVal hFile As Long, ByVal curDistance As Currency, ByVal lMoveMethod As Long) As Currency
Dim li As LARGE_INTEGER
li = Currency2LargeInteger(curDistance)
li.lowpart = SetFilePointer(hFile, li.lowpart, li.highpart, lMoveMethod)
If li.lowpart = -1 Or Err.LastDllError <> 0 Then
li = Currency2LargeInteger(-1@)
End If
MySeek = LargeInteger2Currency(li)
Debug.Print "Seek to "; Hex(li.highpart); Hex(li.lowpart)
End Function