ПрограммированиеФорумОбщее

Delphi. Как узнать владельца метода (2 стр)

Страницы: 1 2 3 4 Следующая »
#15
21:52, 8 дек 2010

Oburec
> я прост доразобраться хотел как через сдвиги указателей до объекта добраться.
> интересно именно через безтиповый pointer

Тут как раз и по коду красивее, и безопаснее (а вдруг в новой версии структура поменяется) обойтись без этого.

А вот когда напрямую с видеопамятью работаешь - там сплошь и рядом над указателями издевательство.
Закраска пиксела, например:
PColor(integer(Mem) + (y*SizeX+x) shl 2)^ := C;
Закраска двух соседних пикселей:
P := PColor(integer(Mem) + (y*SizeX+x) shl 2);
P^ := C;
Inc(P);
P^ := C;

#16
21:58, 8 дек 2010

TObject(ppointer(integer(@e.action) + 4)^) ?

#17
21:59, 8 дек 2010

TarasB
всё изменится только в том случае если указатель будет не 4 байта
на всех 32битных системах событие - это структура TMethod

#18
21:59, 8 дек 2010

>TObject(TMethod(e.action).Data) - это работает
а так:

if(Integer(e)=pInteger(Integer(@e.action)+4)^)then Win();

нет что-ли?

#19
22:30, 8 дек 2010

DevilDevil
> TObject(ppointer(integer(@e.action) + 4)^)
не)
Adler
та же фигня.
По логике. следующие четыре байта указатель на указатель с объектом
1. @e.action - адрес процедуры
2. p =  pointer(integer(@e.action)+4) адрес ссылающийся на указатель с объекьтом
3. Соответственно p должен быть равен @(tmethod(e.action).data)
но они не равны.
пример из под отладчика

tMethod(e.action) = { $4FA01C, $7F904020 }

@(tMethod(e.action).data)= $7F847D24

@e.action = $4FA01C (совпадает с tMethod(e.action).Code)

pointer(integer(@e.action)+4) = $4FA020 (не равно $7F904020 (вообще восьмибайтный адрес в отладчике вылазит))

#20
22:37, 8 дек 2010

я думаю @e.action - это указатель на метод, а не на структуру TMethod

var
  Method: TMethod;
  P: ^TMethod;
begin
  Method := TMethod(e.action );
  P := @Method;

  // указатель на Data
  P := pointer(integer(P) + 4);

  // P^ = Data
  Form1.Caption := TObject(P^).ClassName; 

?

#21
22:42, 8 дек 2010

DevilDevil
> всё изменится только в том случае если указатель будет не 4 байта

А если структура поменяется? Появятся новые поля, и поле Data окажется на новом месте.
Лучше через ретипизацию к TMethod, красивее и надёжнее.

Adler
> нет что-ли?

Использование явных смещений для доступа к чужим структурам там, где можно без этого обойтись - это ГК.

#22
22:49, 8 дек 2010

DevilDevil
не работает тоже.
@e.action  - именно указатель на метод, (Code в структуре). Вообще хотелось понять без именованых указателей как сделать.
сейчас под отладчиком получил 4fa030 - адрес code. т.е. адрес data должен быть 4fa034 а там вообще 8-и байтный адрес. дело в этом. почему так получается правда не понимаю.
и впринципе я заманался уже экспериментировать)

#23
23:01, 8 дек 2010

Oburec
> а там вообще 8-и байтный адрес

Не бывает такого.
То есть в вин32 в прикладных программах - не бывает.

#24
23:01, 8 дек 2010

Oburec
"заманал ты меня военный" (с)

procedure TForm1.FormCreate(Sender: TObject);
var
  Method: TMethod;
  P: pointer;
begin
  Method := TMethod(Form1.OnCreate);
  P := @Method;

  // óêàçàòåëü íà Data
  P := pointer(integer(P) + 4);

  // P^ = Data
  Form1.Caption := TObject(P^).ClassName;
end; 
#25
23:01, 8 дек 2010

TarasB
> TarasB
невероятно но факт) я тоже удивился.
DevilDevil
щас попробу в тестовом проекте. неужели работает?

-----------------

ааа, допер)) благодарю. в предыдущем твоем сообщении недоосмыслил фразу "указатель на структуру а не метод". Работает.

Но кстати так и не понял - в структуре Tmethod адрес data и правда 8-и байтный отображается.
А без приведения к Tmethod как адрес структуры взять?

#26
23:13, 8 дек 2010

Oburec
>Соответственно p должен быть равен @(tmethod(e.action).data)
эта ересь может случайно вызвать e.action.

>1. @e.action - адрес процедуры
это адрес метода, а не процедуры.
>2. p = pointer(integer(@e.action)+4) адрес ссылающийся на указатель с объекьтом
это адрес в котором предположительно хранится указатель на экземпляр класса.
>3. Соответственно p должен быть равен @(tmethod(e.action).data)
нет. разыменованный p предположительно должен быть равен PMethod(@e.action)^.Data
>но они не равны.
не удивительно.

>невероятно но факт) я тоже удивился.
восемь шестнадцатеричных знаков это 4 байта. кэп

#27
23:13, 8 дек 2010

Короче, УМВР

{$APPTYPE CONSOLE}

type
  eventproc = procedure(sender:tobject) of object;

  c = class
    procedure a(sender:tobject);
  end;

procedure c.a;
begin
end;

var
  e: eventproc;
  o: c;

begin
  o := c.Create;
  e := o.a;

  WriteLn(TObject(TMethod(e).Data).ClassName);

  o.Free;
  ReadLn;
end.
#28
23:15, 8 дек 2010

Adler
> эта ересь может случайно вызвать e.action.

ЛОЛШТО?!
[сарказм]
и с каким параметром она его вызовет?
[/сарказм]

Adler
> это адрес метода, а не процедуры.

Адрес подпрограммы - такая формулировка тебя устроит?

Adler
> это адрес в котором предположительно хранится указатель на экземпляр класса.

В этой версии дельфи - да.

#29
23:20, 8 дек 2010

TarasB
если e.action описан так:

TShitClass=class
public:
  function action:pointer;
end;

то запросто.

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.