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;
TObject(ppointer(integer(@e.action) + 4)^) ?
TarasB
всё изменится только в том случае если указатель будет не 4 байта
на всех 32битных системах событие - это структура TMethod
>TObject(TMethod(e.action).Data) - это работает
а так:
if(Integer( e)=pInteger( Integer( @e.action)+4)^)then Win( );
нет что-ли?
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 (вообще восьмибайтный адрес в отладчике вылазит))
я думаю @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;
?
DevilDevil
> всё изменится только в том случае если указатель будет не 4 байта
А если структура поменяется? Появятся новые поля, и поле Data окажется на новом месте.
Лучше через ретипизацию к TMethod, красивее и надёжнее.
Adler
> нет что-ли?
Использование явных смещений для доступа к чужим структурам там, где можно без этого обойтись - это ГК.
DevilDevil
не работает тоже.
@e.action - именно указатель на метод, (Code в структуре). Вообще хотелось понять без именованых указателей как сделать.
сейчас под отладчиком получил 4fa030 - адрес code. т.е. адрес data должен быть 4fa034 а там вообще 8-и байтный адрес. дело в этом. почему так получается правда не понимаю.
и впринципе я заманался уже экспериментировать)
Oburec
> а там вообще 8-и байтный адрес
Не бывает такого.
То есть в вин32 в прикладных программах - не бывает.
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;
TarasB
> TarasB
невероятно но факт) я тоже удивился.
DevilDevil
щас попробу в тестовом проекте. неужели работает?
-----------------
ааа, допер)) благодарю. в предыдущем твоем сообщении недоосмыслил фразу "указатель на структуру а не метод". Работает.
Но кстати так и не понял - в структуре Tmethod адрес data и правда 8-и байтный отображается.
А без приведения к Tmethod как адрес структуры взять?
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 байта. кэп
Короче, УМВР
{$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.Adler
> эта ересь может случайно вызвать e.action.
ЛОЛШТО?!
[сарказм]
и с каким параметром она его вызовет?
[/сарказм]
Adler
> это адрес метода, а не процедуры.
Адрес подпрограммы - такая формулировка тебя устроит?
Adler
> это адрес в котором предположительно хранится указатель на экземпляр класса.
В этой версии дельфи - да.
TarasB
если e.action описан так:
TShitClass=class public: function action:pointer; end;
то запросто.
Тема в архиве.