PDA

Ver la Versión Completa : Manejar dirección API


cardomjar
07-12-2004, 12:29:56
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

Mick
07-12-2004, 13:09:27
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

cardomjar
07-12-2004, 14:40:04
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

cardomjar
07-12-2004, 14:41:57
Perdón.
Puse Mike, cuando realmente es Mick.

roman
07-12-2004, 17:04:35
¿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

cardomjar
07-12-2004, 19:15:05
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.

Mick
07-12-2004, 23:43:37
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

cardomjar
08-12-2004, 12:13:59
Mil gracias Mick. De nuevo funcionó.
Pregunté una cosa y he salido sabiendo dos :-)
Un cordial saludo.