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
NULL
 
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: 32.021
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
NULL
 
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: 32.021
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: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
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 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
NULL
 
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: 2.195
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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
NULL
 
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 18:46:25
redefinir métodos virtuales waremovil C++ Builder 1 25-11-2011 00:07:40
redefinir constructor de TForm Bauhaus1975 OOP 4 20-12-2008 19:06:40
readfile? BetoAlonso Varios 2 05-03-2008 13:10:24
WNET/wnet_error: ReadFile end-of-file errno = 109 evt Firebird e Interbase 0 11-12-2007 15:38:55


La franja horaria es GMT +2. Ahora son las 20:16:31.


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