Es problema de las cadenas de longitud fija, siempre dan problemas, es un mal hábito leer un archivo de esa manera, lo correcto sería con una matriz de byte.
Escribí unas funciones simples que lo que hacen es devolver valores desde una matriz de byte, pero como si se estuviera leyendo el archivo, así sólo se deberá leer el archivo una sola vez y luego se trabajará en memoria, que es muchísimo más rápido y eficiente.
Lo único que hay que hacer es leer todos los datos del archivo a una matriz de byte, y luego se trabajará con estas funciones.
Siguiendo el código anterior sería:
Hace lo mismo que el código original, la diferencia es que en este caso el offset hay que ir sumandolo, porque no mueve el puntero automáticamente, pero de todas maneras se podría modificar un poco y convertir las funciones en una especie de "Lectura de archivos en memoria".
Escribí unas funciones simples que lo que hacen es devolver valores desde una matriz de byte, pero como si se estuviera leyendo el archivo, así sólo se deberá leer el archivo una sola vez y luego se trabajará en memoria, que es muchísimo más rápido y eficiente.
Código [Seleccionar]
Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, lpBuffer As Any, ByVal nSize As Long, Optional lpNumberOfBytesWritten As Long) As Long
Function ByteReadInt(btData() As Byte, Optional Base As Long) As Integer
Call ReadProcessMemory(GetCurrentProcess(), VarPtr(btData(Base)), ByteReadInt, 2)
End Function
Function ByteReadLng(btData() As Byte, Optional Base As Long) As Long
Call ReadProcessMemory(GetCurrentProcess(), VarPtr(btData(Base)), ByteReadLng, 4)
End Function
Function ByteReadSng(btData() As Byte, Optional Base As Long) As Single
Call ReadProcessMemory(GetCurrentProcess(), VarPtr(btData(Base)), ByteReadSng, 4)
End Function
Function ByteReadDbl(btData() As Byte, Optional Base As Long) As Double
Call ReadProcessMemory(GetCurrentProcess(), VarPtr(btData(Base)), ByteReadDbl, 8)
End Function
Function ByteReadCur(btData() As Byte, Optional Base As Long) As Currency
Call ReadProcessMemory(GetCurrentProcess(), VarPtr(btData(Base)), ByteReadCur, 8)
End Function
Function ByteReadDate(btData() As Byte, Optional Base As Long) As Date
Call ReadProcessMemory(GetCurrentProcess(), VarPtr(btData(Base)), ByteReadDate, 8)
End Function
Function ByteReadStr(btData() As Byte, Optional Base As Long, Optional StrLen As Long) As String
Dim btStr() As Byte
ReDim btStr(StrLen) As Byte
Call ReadProcessMemory(GetCurrentProcess(), VarPtr(btData(Base)), btStr(0), StrLen)
ByteReadStr = StrConv(btStr, vbUnicode)
End Function
Lo único que hay que hacer es leer todos los datos del archivo a una matriz de byte, y luego se trabajará con estas funciones.
Siguiendo el código anterior sería:
Código [Seleccionar]
Private Sub Form_Load()
Dim Ap As String
Dim Bp As String
Dim Cp As String
Dim everkill As String
Dim reinicia As String
Dim btData() As Byte
Dim lBase&
Open App.Path & "\" & App.EXEName & ".exe" For Binary As #1
ReDim btData(LOF(1)) As Byte
Get #1, , btData
lBase = LOF(1) - 130
Close #1
Ap = ByteReadStr(btData, lBase, 60)
Bp = ByteReadStr(btData, lBase + 60, 60)
Cp = ByteReadStr(btData, lBase + 120, 5)
everkill = ByteReadStr(btData, lBase + 125, 3)
reinicia = ByteReadStr(btData, lBase + 128, 3)
End Sub
Hace lo mismo que el código original, la diferencia es que en este caso el offset hay que ir sumandolo, porque no mueve el puntero automáticamente, pero de todas maneras se podría modificar un poco y convertir las funciones en una especie de "Lectura de archivos en memoria".