Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.52.29] |
|
Сообщ.
#1
,
|
|
|
А все ли объекты вызывают System._AfterConstruction ?
|
Сообщ.
#2
,
|
|
|
да.
пс. Если более правильно выразится то эта функция взывает метод AfterConstruction у объекта. компилятор просто "расставляет" ее в нужном месте. (точно также как и неявное выделение/освобождение памяти строк/динамических массивов) |
Сообщ.
#3
,
|
|
|
Да точно!)
Кому интересно накидал код, выводит имена создаваемых классов. type PEXCEPTION_POINTERS = ^EXCEPTION_POINTERS; EXCEPTION_POINTERS = packed record ExceptionRecord :^EXCEPTION_RECORD; ContextRecord :PCONTEXT; end; function AddVectoredExceptionHandler(FirstHandler:ULONG; VectoredHandler:Pointer):pointer;stdcall; external 'kernel32.dll'; var Ref:integer = 0; function OnAfterConstruction(obj:TObject): TObject; begin if ( Ref = 0 ) then begin Inc(Ref); obj.AfterConstruction; ShowMessage(obj.ClassName); Dec(Ref); end; result:=obj; end; FUNCTION VectoredHandler( ExceptionInfo:PEXCEPTION_POINTERS):ULONG;stdcall; var p:Pointer; begin Result:=0; if ( ExceptionInfo^.ExceptionRecord^.ExceptionCode = EXCEPTION_SINGLE_STEP ) then begin p :=PWORD( ExceptionInfo^.ContextRecord^.Eip); if ( PBYTE(PChar(p)-1)^ = $F1) and ( PBYTE(PChar(p))^ = $C3) then begin ExceptionInfo^.ContextRecord^.Eip := Cardinal(@OnAfterConstruction); result:=$ffffffff; end; end; end; var ptr:pointer; Attr:Cardinal; ObjRef:TObjectRef; begin FindTypeInfoObject( pointer($401000),ObjRef ); ptr:= GetVMTItem(ObjRef.VMT,MetodAfterConstruction); AddVectoredExceptionHandler(1,@VectoredHandler); VirtualProtect(ptr,sizeof(ptr),PAGE_EXECUTE_READWRITE,@Attr); PWord(ptr)^ := $C3F1; VirtualProtect(ptr,sizeof(ptr),Attr,@Attr); Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. Прикреплённый файлProjects.rar (8,04 Кбайт, скачиваний: 268) Добавлено Версия однопоточная, для нескольких потоков нужно юзать TLS для переменной Ref. Работает для 7 версии дельфи. При запущенном отладчике дельфи работать не будет. |
Сообщ.
#4
,
|
|
|
это получается что если я создам объект в AfterConstruction то его же собственный AfterConstruction не вызовется.
|
Сообщ.
#5
,
|
|
|
ViktorXP
Цитата ViktorXP @ это получается что если я создам объект в AfterConstruction то его же собственный AfterConstruction не вызовется. Почему? покажи пример. Там перехват у TObject.AfterConstruction который сам по себе пустой метод. Так как твой объект будет наследоваться от TObject то AfterConstruction твоего обьекта должна быть вызвана. |
Сообщ.
#6
,
|
|
|
Цитата 0day @ var Ref:integer = 0; function OnAfterConstruction(obj:TObject): TObject; begin if ( Ref = 0 ) then begin Inc(Ref); obj.AfterConstruction; ShowMessage(obj.ClassName); Dec(Ref); end; result:=obj; end; после инкремента Ref, уловие не будет срабатывать и соответственно все объекты которые будут порождены в период от инкремента до декремента будут отрабатывать мимо этого куска кода. соответственно obj.AfterConstruction для их не вывозется |
Сообщ.
#7
,
|
|
|
ViktorXP
В целом AfterConstruction вроде как можно и не вызывать даже, там все равно ret. Тоесть AfterConstruction у TObject все равно пустой метод. я не прав? А не подскажите почему TForm не вызывает AfterConstruction ? |
Сообщ.
#8
,
|
|
|
Цитата 0day @ В целом AfterConstruction вроде как можно и не вызывать даже, там все равно ret. У TObject - да, а у той же TCustomForm и ее наследниках - во-первых, не пустой, во-вторых, не вызывает inherited, поэтому твой код для TForm и не работает. А если бы был вызов inherited, то твой OnAfterConstruction мог бы "наломать дров" из-за повторногом вызова obj.AfterConstruction |
Сообщ.
#9
,
|
|
|
А в каком случаи вызывается NewInstance ? При выделении под класс памяти ?
|
Сообщ.
#10
,
|
|
|
Да
PS: Интересно, для чего ты FindTypeInfoObject юзаешь - для инжекта в сторонний процесс или exe? Малварь изобретаешь или свою навесную защиту и т.п.? |
Сообщ.
#11
,
|
|
|
нужно немного изменить поведение программы, с закрытыми исходниками.
|