Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-12-2004
cardomjar cardomjar is offline
Miembro
 
Registrado: dic 2004
Posts: 14
Poder: 0
cardomjar Va por buen camino
Manejar dirección API

Hola:

Soy un novato con el Delphi. Lamento la posible obviedad de la pregunta.

Me gustaría obtener la dirección de una API de Windows y manejarla. Para ello defino:

FuncPtr1:TFarProc;

En el código:
Handle := LoadLibrary('user32.dll');
funcPtr1 := getprocaddress(handle,'SendMessageA');


Quisiera convertir el puntero "funcPtr1" tanto en un valor numérico como en formato String.

Me explico: con el depurador observo que lo que obtiene "funcPtr1" es la dirección correcta de la API (en mi caso $77E15FDA).

Por un lado. desearía obtener el valor en decimal del valor hexadecimal 77E15FDA. En este caso concreto sería 2011258842.

Tambien desearía obtener el string "77E15FDA"

Gracias de antemano y un saludo
Responder Con Cita
  #2  
Antiguo 07-12-2004
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
Si simplemente necesitas llamar a las funciones del api, no necesitas cargar dinamicamente las dll, las dlls principales ya estan cargadas porque ya son necesarias para el programa, Delphi ya tiene varias units para llamar a las funciones del api. Un simple:

uses windows;

Te permite llamar directamente a la a funcion: SendMessage del Api.

Para pasar a string el valor del puntero, basta que hagas un cast a un integer, y uses la funcion Format o IntToHex o IntToStr

s:= Format('%u', [ Integer(funcPtr1) ] );

s:= Format('%x', [ Integer(funcPtr1) ] );

Saludos
Responder Con Cita
  #3  
Antiguo 07-12-2004
cardomjar cardomjar is offline
Miembro
 
Registrado: dic 2004
Posts: 14
Poder: 0
cardomjar Va por buen camino
Hola Mike:

Gracias por la respuesta; ha funcionado como la seda.

Abusando de tu tiempo y, en alusión a la primera parte de tu respuesta, parece claro que no es necesario cargar las librerías del sistema para llamar hacer referencia a sus API's; en ese caso ¿cómo obtengo el handle de 'user32.dll' para realizar la llamada siguiente?:

funcPtr1 := getprocaddress(handle,'SendMessageA');

Gracias de nuevo y un saludo
Responder Con Cita
  #4  
Antiguo 07-12-2004
cardomjar cardomjar is offline
Miembro
 
Registrado: dic 2004
Posts: 14
Poder: 0
cardomjar Va por buen camino
Perdón.
Puse Mike, cuando realmente es Mick.
Responder Con Cita
  #5  
Antiguo 07-12-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por cardomjar
¿cómo obtengo el handle de 'user32.dll' para realizar la llamada siguiente?:

funcPtr1 := getprocaddress(handle,'SendMessageA');
Pero es como te dice Mick, no tienes necesidad de esto ya que todas esas funciones están ya declaradas y no tienes más que usarlas como cualquier otra función de Delphi.

En Delphi estas funciones se declaran con la directiva external, por ejemplo

function SendMessage; external 'user32.dll' name 'SendMessageA';

En cuanto el comiplador ve una declaración así, añade el código necesario para cargar la librería user32 y asignar a SendMessage la función que en la librería tenga nombre SendMessageA.

Así, puedes usar SendMessage como cualquier otra función.

La gran mayoría de funciones de la API de Windows están ya declaradas así en la unidad Windows.pas y otras y el método al que te refieres sólo es necesario para las que no lo estén y eso sólo en el caso de que desees una carga dinámica de la librería en lugar de la carga implícita que se da al usar external.

// Saludos
Responder Con Cita
  #6  
Antiguo 07-12-2004
cardomjar cardomjar is offline
Miembro
 
Registrado: dic 2004
Posts: 14
Poder: 0
cardomjar Va por buen camino
Hola Roman:

Gracias por tu respuesta pero en este caso concreto, lo que yo quiero no es utilizar la API, sino saber su dirección. Con la respuesta de Mick, ya se como hacerlo pero aún no se como obtener el "handle" de "user32.dll" para realizar la llamada a "getProcessAddress" sin realizar previamente el "LoadLibrary".

Un saludo.
Responder Con Cita
  #7  
Antiguo 07-12-2004
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
En lugar de usar LoadLibrary puedes usar:

Handle:= GetModuleHandle('user32.dll');

para localizar el handle de una dll que ya haya sido cargada por delphi
previamente.

Saludos
Responder Con Cita
  #8  
Antiguo 08-12-2004
cardomjar cardomjar is offline
Miembro
 
Registrado: dic 2004
Posts: 14
Poder: 0
cardomjar Va por buen camino
Mil gracias Mick. De nuevo funcionó.
Pregunté una cosa y he salido sabiendo dos :-)
Un cordial saludo.
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 05:54:17.


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