No me lee archivo

Iniciado por fary, 22 Abril 2010, 21:15 PM

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

fary

Hola, tengo el siguiente problema, estoy intentando leer un mediante api pero nose porqeu demonios no me coje los datos, este es el code:

Código (vb) [Seleccionar]
Option Explicit

Public Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Public Declare Function ReadFile Lib "kernel32.dll" (ByVal hFile As Long, ByRef lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, ByRef lpNumberOfBytesRead As Long, ByRef lpOverlapped As Any) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long


Public Const GENERIC_READ = &H80000000
Public Const FILE_SHARE_READ = &H1
Public Const FILE_ATTRIBUTE_NORMAL = &H80
Public Const OPEN_EXISTING As Long = 3

Public Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type
Public Type OVERLAPPED
    ternal As Long
    ternalHigh As Long
    offset As Long
    OffsetHigh As Long
    hEvent As Long
End Type


Public Function Archivo(ruta As String) As Boolean
    Dim abrirarchivo As Long
    Dim sa As SECURITY_ATTRIBUTES
    Dim leerarchivo As Long
    Dim over As OVERLAPPED
    Dim buffer As String
    Dim nada As Long
    Dim bytesleidos As Long
    abrirarchivo = CreateFile(ruta, GENERIC_READ, FILE_SHARE_READ, sa, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
    buffer = Space(FileLen(ruta))
    leerarchivo = ReadFile(abrirarchivo, buffer, nada, bytesleidos, over)
    Call CloseHandle(abrirarchivo)
    MsgBox buffer
End Function

Sub Main()
    Call Archivo("c:\feo.txt")
End Sub


espero vuestra ayuda.

salu2!
Un byte a la izquierda.

Dr [F]

drinky.. para que complicarte la vida usando API .. ?'

acuerdate esto:

Mientras mas lineas tiene el programa mas pesa y mas bugs puede tner  :-\

Bye !
"Una vulnerabilidad es tan limitada como tu quieres que lo sea"

[H] Risk T --> Dr [F]

fary

Cita de: frankitox en 22 Abril 2010, 21:25 PM
drinky.. para que complicarte la vida usando API .. ?'

acuerdate esto:

Mientras mas lineas tiene el programa mas pesa y mas bugs puede tner  :-\

Bye !

hay que saber mas  opciones... si siempre tienes una unica salida habra veces que no te servira.

salu2!
Un byte a la izquierda.

PeterPunk77

En la llamada a la API ReadFile hay un par de errores:
- El buffer se lo tienes que pasar por valor.
- No le indicas el número de bytes que tiene que leer (tu variable nada, que no está inicializada)

Debería ser así:
Código (vb) [Seleccionar]
leerarchivo = ReadFile(abrirarchivo, ByVal buffer, FileLen(ruta), bytesleidos, over)
o mejor aún:
Código (vb) [Seleccionar]
Dim BytesALeer as Long
  BytesALeer = FileLen(ruta)
  buffer = Space(BytesALeer)
  leerarchivo = ReadFile(abrirarchivo, ByVal buffer, BytesALeer, bytesleidos, ByVal over)


Saludos.

fary

Muchas gracias... me falto ese byval que fallo xD!

salu2!
Un byte a la izquierda.