Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.06;
Скачать: CL | DM;

Вниз

Создание объектов   Найти похожие ветки 

 
euru ©   (2003-02-19 17:31) [0]

Можно ли как-нибудь мониторить создание объектов?


 
MBo ©   (2003-02-19 17:34) [1]

Если объект при своем создании что-нибудь сообщает, то можно ;)


 
Mystic ©   (2003-02-19 17:36) [2]

Можно получить список объектов, порожденных от указанного типа... Но требует некоторых телодвижений...


 
REA ©   (2003-02-19 17:39) [3]

Объектов? Не думал что ссылки на объекты запоминаются где либо, кроме моих собственных переменных.


 
Reindeer Moss Eater   (2003-02-19 17:47) [4]

unit MyClassUnit;

interface

type
TMyClass = class
...
class function GetInstance(AIndex:integer):TMyClass;
end;

implementation

var MyList : TList = nil;

constructor TMyClass.Create;
begin
inherited;
MyList.Add(Self);
end;

function TMyClass.GetInstance(AIndex:integer):TMyClass;
begin
Result:=TMyClass(MyList);
end;

initialization
MyList:=TList.Create;
finalization
MyList.Free;
end;


 
euru ©   (2003-02-19 17:48) [5]

> MBo © (19.02.03 17:34)
> Mystic © (19.02.03 17:36)

Оба варианта не подходят.
В первом случае объект должен знать, что в его обязанности входит сообщать, что он создан. А, насколько я знаю, стандартные объекты в VCL этого делать не умеют и, значит, уйдут от своих обязанностей :).
Второй случай не подходит, потому что мне не нужен список созданных объектов. Мне нужно поймать момент создания любого объекта.

Пробовал подменить TObject.NewInstance, но в ответ получил исключение на тему отсутствия доступа.


 
Mystic ©   (2003-02-19 17:49) [6]

Да, поправочка: для стандартного менеджера памяти...

Вот фрагмент из System.pas:
{$IFDEF DEBUG_FUNCTIONS}
{ Inspector Query; implementation in GETMEM.INC; no need to conditionalize that }
THeapBlock = record
Start: Pointer;
Size: Cardinal;
end;

THeapBlockArray = array of THeapBlock;
TObjectArray = array of TObject;

function GetHeapBlocks: THeapBlockArray;
function FindObjects(AClass: TClass; FindDerived: Boolean): TObjectArray;
{ Inspector Query }
{$ENDIF}


 
MBo ©   (2003-02-19 17:49) [7]

>момент создания любого объекта
вообще любого? или только компонентов или контролов?


 
Reindeer Moss Eater   (2003-02-19 17:52) [8]

Сначала неплохо бы определиться.
Во всех процессах ловить надо или только в своем?


 
euru ©   (2003-02-19 17:56) [9]

> MBo © (19.02.03 17:49)
Любого, в том числе и TObject.

Лучшим вариантом, как мне кажется, была подмена стандартного метода TObject.NewInstance своим методом, который бы вызвал стандартный, а также сообщил куда следует и кому следует.


 
Mystic ©   (2003-02-19 17:56) [10]

> euru © (19.02.03 17:48)

Не думаю, чтобы затраты на реализацию окупились... Какую цель ты преследуешь?


 
euru ©   (2003-02-19 17:58) [11]

>Reindeer Moss Eater (19.02.03 17:52)

Для начала можно в своем однопоточном процессе


 
gsu ©   (2003-02-19 18:00) [12]

>> Не думаю, чтобы затраты на реализацию окупились... Какую цель ты
>> преследуешь?
D8 пишет (-:|~


 
euru ©   (2003-02-19 18:07) [13]

>Mystic © (19.02.03 17:56)

Цель: получить доступ к объекту ЛЮБОГО класса при его создании.

А затраты пока еще рано считать - еще не решили, как это реализовать :)


 
euru ©   (2003-02-19 18:09) [14]

> gsu © (19.02.03 18:00)
>D8 пишет (-:|~

А хотя бы... :)))


 
Mystic ©   (2003-02-19 18:20) [15]

Хорошо, реализовать то, о чем ты просишь, можно
A. Подправив VCL/RTL
B. Подправить используемые таблицы виртуальных/динамических методов.


 
euru ©   (2003-02-19 22:31) [16]

>Mystic © (19.02.03 18:20)

Вариант A не подходит - не хочется править исходники производителя.
Вариант B - это как раз то, что я попытался сделать. Но как только попытался подменить функцию NewInstance своей, получил исключение.


 
euru ©   (2003-02-20 14:30) [17]

Может еще у кого-нибудь мысли какие-нибудь появились?


 
Palladin ©   (2003-02-20 14:51) [18]


> как только попытался подменить функцию NewInstance своей,
> получил исключение.

значит некорректно подменил
можно поинтересоватся процессом подмены?


 
euru ©   (2003-02-20 14:58) [19]


procedure TImpl.RegisterObject(aObj: TClass);
var p: Pointer;
begin
p := Pointer(Integer(aObj) + vmtNewInstance);
FOld := PPointer(p)^; //aObj.NewInstance;
PPointer(p)^ := @TImpl.MyNewInstance; // exception здесь
end;


 
euru ©   (2003-02-20 16:12) [20]

>Palladin © (20.02.03 14:51)

что в моем коде некорректно?


 
down   (2003-02-20 16:36) [21]


> Можно ли как-нибудь мониторить создание объектов?

MemCheck вроде это делает http://v.mahon.free.fr/pro/freeware/memcheck


 
euru ©   (2003-02-21 20:25) [22]

>down (20.02.03 16:36)

Посмотрел я MemCheck. Это не то, что мне нужно.

Может, еще какие мысли есть?



Страницы: 1 вся ветка

Текущий архив: 2003.03.06;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.024 c
1-17080
jen_bond
2003-02-25 18:32
2003.03.06
Scroll в DBCtrlGrid


9-16852
CHiF_
2002-10-07 12:57
2003.03.06
dxg формат


4-17461
UltraFreak
2003-01-14 18:51
2003.03.06
Блокировка диалогов


14-17273
[lamer]Barmaglot
2003-02-18 14:18
2003.03.06
Диски с больше Z.


3-16927
Itap
2003-02-14 16:24
2003.03.06
Я уже не знаю что делать