PDA

Ver la Versión Completa : Punteros a Procesos (procedures)


gersojn
03-08-2011, 19:25:27
Hola, les comentos que tengo el siguiente problema:

Estoy haciendo una aplicacion, donde tengo varios procesos, con la siguiente estructura:


procedure proceso1();
begin
end;

procedure proceso2();
begin
end;
.........
procedure x();
begin
end;



y necesito saber la direccion en memoria de algun proceso en particular, se que se hace por punteros, pero soy nuevo en delphi y aun no he trabajado con ellos.

De momento tengo el siguiente codigo para hacer pruebas.


procedure proceso1();
begin

end;

procedure memoria();
var
puntero: procedure();
begin
puntero:=proceso1;
end;


Entonces, no se si sea correcto la anterior expresion, no me generar ningun tipo de error, entonces las preguntas son:

Estoy capturando la direccion en memoria del proceso1?
si es asi como imprimo la direccion, en un tlabel o un ShowMessage?

De antemano muchas, gracias.

escafandra
03-08-2011, 20:44:00
type
TProc1 = procedure;

procedure PP;
begin
Beep;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Proc: TProc1;
begin
// Asigno el puntero de un procedimiento
Proc:= @PP;
// Con ese puntero puede ejecutar el procedimiento
Proc;
// Y muestro su dirección en hexadecimal
ShowMessage(IntToHex(Integer(@PP), 8));
end;



Saludos

ecfisa
03-08-2011, 20:44:36
Estoy capturando la direccion en memoria del proceso1?
si es asi como imprimo la direccion, en un tlabel o un ShowMessage?
Hola gersojn.

En la asignación: puntero:=proceso1; estas capturando la dirección del procedimiento proceso1, en la variable puntero .

Un ejemplo para mostrar la dirección:

type
TProcedurePtr = procedure;

procedure proceso1;
begin
//...
end;

procedure proceso2;
begin
//...
end;

procedure TForm1.Button1Click(Sender: TObject);
var
p1,p2: TProcedurePtr;
begin
p1:= @proceso1;
p2:= @proceso2;
ShowMessage(Format('%p %p',[@p1, @p2]));
// O en decimal
ShowMessage(Format('%d %d',[ULong(@p1),ULong(@p2)]));
end;


Saludos.

Casi al mismo tiempo :)

escafandra
03-08-2011, 20:52:31
Casi al mismo tiempo :)

Sip, es que cuando las cosas son de una manera sólo pueden ser de esa manera :p.

PD ¿Me pareció leer... Casi lo mismo y casi al mismo tiempo?

Saludos.

gersojn
03-08-2011, 21:15:56
Gracias por la respuesta, lo imprimi con un:
ShowMessage(Format('%p',[@puntero]));

Gracias por responder.

ecfisa
03-08-2011, 21:27:08
PD ¿Me pareció leer... Casi lo mismo y casi al mismo tiempo?

Leiste bién ;), pero como usaste una función diferente para mostrarlo (y por lo tanto otra alternativa) me pareció adecuado corregirlo para que quede destacado.

Un saludo.:)