Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
14-17337
Evgeny
2003-02-15 09:25
2003.03.06
Indy Clients адрес сайта


1-17126
.::D.e.M.o.N.i.X::.
2003-02-22 17:54
2003.03.06
Как использовать две картинки из ImageList для TreeView


1-17106
OlDemon
2003-02-26 07:03
2003.03.06
Преобразование числа в текст


6-17221
Anton
2003-01-16 17:27
2003.03.06
Как программно получить доступ к вложениям электронной почты


1-17159
Aragus
2003-02-23 21:52
2003.03.06
Меню





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский