Форум: "Основная";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];
ВнизСоздание объектов Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.022 c