Error 458

Iniciado por Hendrix, 16 Marzo 2006, 20:49 PM

0 Miembros y 1 Visitante están viendo este tema.

Hendrix

Weno, les pondre el kode y luego se lo expliko:

Private Sub Form_Load()
Dim everkill As String * 3
Dim reinici As String * 3
Dim A As String * 60
Dim B As String * 60
Dim C As String * 5
Dim Ap As String
Dim Bp As String
Dim Cp As String

Open App.Path & "\" & App.EXEName & ".exe" For Binary As #1
Seek (1), LOF(1) - 130
Get #1, , A
Get #1, , B
Get #1, , C
Get #1, , everkill
Get #1, , renici
Close #1

Ap = Trim(A)
Bp = Trim(B)
Cp = Trim(C)



Weno, al kompilar este proyecto (el kode es un trozo del proyecto) kuando lo ejekuta antes de abrirse la ventana del form sale esto:

CitarError '458' en tiempo de ejecucion:

La variable usa un tipo de Automatización no Permitida en VB

Kual es el error de esta aplicaccion????

Antes diseñaba proyectos kon las mismas caracteristikas y funcionaban... :-\ :-\ :-\

Salu2

Hendrix

"Todos los días perdemos una docena de genios en el anonimato. Y se van. Y nadie sabe de ellos, de su historia, de su peripecia, de lo que han hecho, de sus angustias, de sus alegrías. Pero al menos una docena de genios se van todos los días sin que sepamos de ellos". - Juan Antonio Cebrián

NYlOn

Yo lo prove y no me tira ningun error :S

Una observacion:
Declaraste una variable reinici y usas renici.
Osea que "renici" no esta declarada. Tal vez ese ese el error, pero ni idea.

Saludos.-

.Slasher-K.

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.


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:


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".