Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-08-2013
Jais Jais is offline
Miembro
 
Registrado: Jul 2013
Posts: 12
Poder: 0
Jais Va por buen camino
Redefinir API ReadFile

Hola

Yo tengo este codigo y me funciona bien:

Código:
var
  Fichero: THandle;
  Tamano: Int64;
  c: Cardinal;
  BufferTXT: Pointer;

Fichero := CreateFile(PAnsiChar('C:\archivo.txt'), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
if Fichero <> INVALID_HANDLE_VALUE then
  begin
    Tamano := GetFileSize(Fichero, nil);
    BufferTXT := VirtualAlloc(nil, Tamano, MEM_COMMIT, PAGE_READWRITE);
    SetFilePointer(Fichero, 0, nil, FILE_BEGIN);
    ReadFile(Fichero, BufferTXT^, Tamano, c, nil);
  end;
  CloseHandle(Fichero);
Ahora lo que quiero hacer es "redefinir las funciones GetFileSize y ReadFile" y utilizar las mias, es decir(Para el caso de GetFileSize):

type
TGetFileSiz: Function(hFile: Cardinal;lpFileSizeHigh:Pointer): Cardinal; StdCall;

Ahora mediante GetProcAddress(LoadLibrary('Kernel32.dll'), 'GetFileSize') obtengo la direccion a GetFileSize y de este modo puedo utilizar la mia propia.

Pero el problema esta cuando quiero "redefinir ReadFile" ya que segun esta API los tipos de sus parametros son:

hFile:Cardinal
lpBuffer: UnTyped
nNumberOfBytesToRead: Cardinal
lpNumberOfBytesRead:Cardinal
lpOverlapped: POverLapped

Como pueden ver el 2º parametro pone: UnTyped y ahi es donde tengo el problema.

¿Que tipo puedo ponerle al redefinir la api al 2º parametro(lpBufffer: UnTyped) para que el codigo de arriba me siga funcionando y sin cambiar el codigo de arriba?

Espero me haya explicado bien.

Muchisimas gracias de antemano!!

Saludos
Responder Con Cita
  #2  
Antiguo 19-08-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.246
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración

Recuerda poner los tags al código fuente, ejemplo:



Gracias
Responder Con Cita
  #3  
Antiguo 19-08-2013
Jais Jais is offline
Miembro
 
Registrado: Jul 2013
Posts: 12
Poder: 0
Jais Va por buen camino
ok, lo siento Casimiro Notevi. Aqui pongo el post con el estilo correcto.

Hola

Yo tengo este codigo y me funciona bien:

Código Delphi [-]
var
  Fichero: THandle;
  Tamano: Int64;
  c: Cardinal;
  BufferTXT: Pointer;

Fichero := CreateFile(PAnsiChar('C:\archivo.txt'), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
if Fichero <> INVALID_HANDLE_VALUE then
  begin
    Tamano := GetFileSize(Fichero, nil);
    BufferTXT := VirtualAlloc(nil, Tamano, MEM_COMMIT, PAGE_READWRITE);
    SetFilePointer(Fichero, 0, nil, FILE_BEGIN);
    ReadFile(Fichero, BufferTXT^, Tamano, c, nil);
  end;
  CloseHandle(Fichero);

Ahora lo que quiero hacer es "redefinir las funciones GetFileSize y ReadFile" y utilizar las mias, es decir(Para el caso de GetFileSize):

Código Delphi [-]
type
TGetFileSiz: Function(hFile: Cardinal;lpFileSizeHigh:Pointer): Cardinal; StdCall;

Ahora mediante GetProcAddress(LoadLibrary('Kernel32.dll'), 'GetFileSize') obtengo la direccion a GetFileSize y de este modo puedo utilizar la mia propia.

Pero el problema esta cuando quiero "redefinir ReadFile" ya que segun esta API los tipos de sus parametros son:


Código Delphi [-]
hFile:Cardinal
lpBuffer: UnTyped
nNumberOfBytesToRead: Cardinal
lpNumberOfBytesRead:Cardinal
lpOverlapped: POverLapped

Como pueden ver el 2º parametro pone: UnTyped y ahi es donde tengo el problema.

¿Que tipo puedo ponerle al redefinir la api al 2º parametro(lpBufffer: UnTyped) para que el codigo de arriba me siga funcionando y sin cambiar el codigo de arriba?

Espero me haya explicado bien.

Muchisimas gracias de antemano!!

Saludos
Responder Con Cita
  #4  
Antiguo 19-08-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.246
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Jais Ver Mensaje
ok, lo siento Casimiro Notevi. Aqui pongo el post con el estilo correcto.
No hay problema, es normal en los nuevos
Responder Con Cita
  #5  
Antiguo 20-08-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: Dec 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.045
Poder: 29
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por Jais Ver Mensaje
...
Pero el problema esta cuando quiero "redefinir ReadFile" ya que segun esta API los tipos de sus parametros son:

hFile:Cardinal
lpBuffer: UnTyped
nNumberOfBytesToRead: Cardinal
lpNumberOfBytesRead:Cardinal
lpOverlapped: POverLapped

Como pueden ver el 2º parametro pone: UnTyped y ahi es donde tengo el problema.

¿Que tipo puedo ponerle al redefinir la api al 2º parametro(lpBufffer: UnTyped) para que el codigo de arriba me siga funcionando y sin cambiar el codigo de arriba?
Hola Jais.

En realidad el segundo parámetro de la función ReadFile es de tipo LPVOID, un puntero sin tipo:
Código:
typedef void *LPVOID;
Es decir que en Delphi lo podés declarar de tipo Pointer.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 20-08-2013
Jais Jais is offline
Miembro
 
Registrado: Jul 2013
Posts: 12
Poder: 0
Jais Va por buen camino
Muchisimas gracias por la respuesta ecfisa, pero lo acabo de probar y no me funciona.

Asi es como lo he declarado:

Código Delphi [-]
type
TReadFile: Function(hFile:Cardinal;var lpBuffer: Pointer ;nNumberOfBytesToRead,lpNumberOfBytesRead:Cardinal;lpOverlapped: POverLapped): LongBool; StdCall;

Y me da error en el 2º parametro y el error que me pone es el siguiente:

Types of actual and formal var parameters must be identical

Saludos
Responder Con Cita
  #7  
Antiguo 20-08-2013
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: Nov 2007
Posts: 1.927
Poder: 13
escafandra Va camino a la famaescafandra Va camino a la fama
En realidad ecfisa tiene razón pues la declaración de las APIs que hace Microsoft son para C. El caso es que delphi hace alguna "trampilla sintáctica" y la declaración, para que te funcione con los mismos tipos de parámetros es la siguiente:
Código Delphi [-]
type
TReadFile = function(hFile: Cardinal; var Buffer; nNumberOfBytesToRead: Cardinal; var NumberOfBytesRead: Cardinal; lpOverlapped: POverLapped): LongBool;  stdcall;

Saludos.
Responder Con Cita
  #8  
Antiguo 22-08-2013
Jais Jais is offline
Miembro
 
Registrado: Jul 2013
Posts: 12
Poder: 0
Jais Va por buen camino
Muchísimas gracias escafandra!! Lo he puesto como tu has dicho y ha funcionado perfectamente! Gracias!

Si ecfisa tenia razón porque así es exactamente como esta en la msdn, pero como dice escafandra, delphi hace alguna "trampilla sintáctica".

Muchísimas gracias a los dos por sus respuestas!!

Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Redefinir procedure OnShow en form heredado. Walterio OOP 3 11-09-2012 17:46:25
redefinir métodos virtuales waremovil C++ Builder 1 24-11-2011 23:07:40
redefinir constructor de TForm Bauhaus1975 OOP 4 20-12-2008 18:06:40
readfile? BetoAlonso Varios 2 05-03-2008 12:10:24
WNET/wnet_error: ReadFile end-of-file errno = 109 evt Firebird e Interbase 0 11-12-2007 14:38:55


La franja horaria es GMT +2. Ahora son las 20:05:03.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi