Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Redefinir API ReadFile (https://www.clubdelphi.com/foros/showthread.php?t=83946)

Jais 19-08-2013 20:07:50

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

Casimiro Notevi 19-08-2013 21:02:15

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 :)

Jais 19-08-2013 21:11:22

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

Casimiro Notevi 19-08-2013 21:18:52

Cita:

Empezado por Jais (Mensaje 465779)
ok, lo siento Casimiro Notevi. Aqui pongo el post con el estilo correcto.

No hay problema, es normal en los nuevos :)

ecfisa 20-08-2013 12:51:26

Cita:

Empezado por Jais (Mensaje 465775)
...
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 :)

Jais 20-08-2013 13:00:56

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

escafandra 20-08-2013 17:06:38

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.

Jais 22-08-2013 13:46:04

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


La franja horaria es GMT +2. Ahora son las 09:57:18.

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