На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Обязательно выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Этот раздел предназначен для вопросов, посвященных разработке компонентов, а также для тестирования собственных бесплатных компонентов с открытым исходным кодом.

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.
Модераторы: Rouse_, DimaBr
  
> Вызов _AfterConstruction
    А все ли объекты вызывают System._AfterConstruction ?
      да.
      пс. Если более правильно выразится то эта функция взывает метод AfterConstruction у объекта. компилятор просто "расставляет" ее в нужном месте. (точно также как и неявное выделение/освобождение памяти строк/динамических массивов)
        Да точно!)

        Кому интересно накидал код, выводит имена создаваемых классов.

        ExpandedWrap disabled
          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 Кбайт, скачиваний: 251)

        Добавлено
        Версия однопоточная, для нескольких потоков нужно юзать TLS для переменной Ref.
        Работает для 7 версии дельфи.
        При запущенном отладчике дельфи работать не будет.
          это получается что если я создам объект в AfterConstruction то его же собственный AfterConstruction не вызовется.
            ViktorXP
            Цитата ViktorXP @
            это получается что если я создам объект в AfterConstruction то его же собственный AfterConstruction не вызовется.

            Почему? покажи пример.

            Там перехват у TObject.AfterConstruction который сам по себе пустой метод.
            Так как твой объект будет наследоваться от TObject то AfterConstruction твоего обьекта должна быть вызвана.
              Цитата 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 для их не вывозется
              Сообщение отредактировано: ViktorXP -
                ViktorXP
                В целом AfterConstruction вроде как можно и не вызывать даже, там все равно ret.
                Тоесть AfterConstruction у TObject все равно пустой метод.
                я не прав?

                А не подскажите почему TForm не вызывает AfterConstruction ?
                  Цитата 0day @
                  В целом AfterConstruction вроде как можно и не вызывать даже, там все равно ret.

                  У TObject - да, а у той же TCustomForm и ее наследниках - во-первых, не пустой, во-вторых, не вызывает inherited, поэтому твой код для TForm и не работает. А если бы был вызов inherited, то твой OnAfterConstruction мог бы "наломать дров" из-за повторногом вызова obj.AfterConstruction
                  Сообщение отредактировано: leo -
                    А в каком случаи вызывается NewInstance ? При выделении под класс памяти ?
                      Да

                      PS: Интересно, для чего ты FindTypeInfoObject юзаешь - для инжекта в сторонний процесс или exe? Малварь изобретаешь или свою навесную защиту и т.п.?
                        нужно немного изменить поведение программы, с закрытыми исходниками.
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0313 ]   [ 19 queries used ]   [ Generated: 18.04.24, 10:24 GMT ]