Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Вниз

IntfClear   Найти похожие ветки 

 
Alkid ©   (2006-09-04 10:20) [0]

Есть в недрах Дельфишного rtl функция IntfClear, которая есть по сути деструктор указателя на COM-интерфейс (т.е. всего, что
наследовано от IUnknown).
Вопрос - можно ли как-нибудь легально, без изменения исходников System.pas заменить эту функцию на свою в отладочных целях?

Если нет, то другой вопрос - всегда ли rtl линкуется к программе статически или же может как и vcl - динамически?


 
oxffff ©   (2006-09-04 10:27) [1]

IntfClear Очищает указатель и вызывает _Release.
Так может проще в _Release и вызывать процедурку для отладки?


 
Сергей М. ©   (2006-09-04 10:28) [2]


> всегда ли rtl линкуется к программе статически


Не всегда.
Только при Build With Run-Time Packages = False


 
oxffff ©   (2006-09-04 10:29) [3]

Alkid
>Есть в недрах Дельфишного rtl функция IntfClear, которая есть по сути >деструктор указателя на COM-интерфейс (т.е. всего, что
>наследовано от IUnknown).

Это не деструктор.


 
Alkid ©   (2006-09-04 10:35) [4]


> Не всегда.
> Только при Build With Run-Time Packages = False

Хорошо, тогда как называется rtl-овский пакет?


> IntfClear Очищает указатель и вызывает _Release.
> Так может проще в _Release и вызывать процедурку для отладки?

Ситуация такова: в этой функции возникает исключение, как раз при обращении к _Release. Иными словами, где-то COM-объект удаляется нештаттно и при "зачистке" ссылки на него происходит вызов ._Release у уже мёртвого объекта.
У сожалению отладка с применением break-point`ов не даёт результата - при остановке на break-point исключение никогда не происходит, там явно race-condition. Иными словами, идентифицировать сам код, где "зачищается" указатель я пока не могу. Для этого я и хочу временно модифицировать IntfClear, что бы отловить там это каким-нибудь Assert`ом и раскрутить стэк вызовов до интересующего меня кода. Вот :)


> Это не деструктор.

Формально да, но он вызывается всегда при удалении переменной-ссылки, то есть по сути играет роль деструктора.


 
oxffff ©   (2006-09-04 10:40) [5]

Этот проблеменый Interface ваш?
Или сторонний. Имеется ввиду есть исходники _Release.


 
Alkid ©   (2006-09-04 10:43) [6]


> Этот проблеменый Interface ваш?
> Или сторонний. Имеется ввиду есть исходники _Release.

Наш, наш :-) Скорее всего даже мой. Исходники _Release там везде одни и те же, ибо всё наследуется от TInterfacedObject или TComObject...
Хотя уже спасибо, ты меня навёл на одну гениальную идею :)


 
oxffff ©   (2006-09-04 10:48) [7]

Если ваш тогда.

_Release
....
Result := InterlockedDecrement(FRefCount);
  if Result = 0 then  Destroy;
............

Наверно на эту.


 
Сергей М. ©   (2006-09-04 10:50) [8]


> как называется rtl-овский пакет?
>


Так и называется - rtl70.bpl (для случая с Д7)


 
Alkid ©   (2006-09-04 10:56) [9]


> Result := InterlockedDecrement(FRefCount);
>   if Result = 0 then  Destroy;

Ну лично я этого кода не писал, но у меня появилась другая мысль - я
деструктор этих объектов (а львиная доля их наследуется от одного нашего класса) обложил Asset`ом FRefCount <= 0.


> Так и называется - rtl70.bpl (для случая с Д7)

То есть если его не указано в списке пакетов на динамическую линковку, то таки линкуется статически, да?


 
Сергей М. ©   (2006-09-04 11:02) [10]


> если его не указано в списке пакетов на динамическую линковку,
>  то таки линкуется статически, да?
>


Нет.
Если BwRTP=TRUE, то RTLXX.BPL линкуется динамически ВНЕ зависимости от того, перечислил ты этот пакет в списке пакетов или не перечислил.


 
Alkid ©   (2006-09-04 11:07) [11]

Хм. Не знаю как в семёрке, но у меня на пятом я не вижу в списке загруженных модулей что-то похожее на rtl-пакет при BwRTP=TRUE. Видим тт уже сказывается
разница в версиях. Но всё равно спасибо, совместными усилиями вы натолкнули меня на идею, как решить проблему :)


 
Сергей М. ©   (2006-09-04 11:12) [12]


> Alkid ©   (04.09.06 11:07) [11]


В 5-ке, насколько помнится, файл RTL-пакета как таковой отдельный не существует  - там RTL и VCL объединены в VCL50.bpl


 
oxffff ©   (2006-09-04 11:13) [13]

Наш, наш :-) Скорее всего даже мой. Исходники _Release там везде одни и те же, ибо всё наследуется от TInterfacedObject или TComObject...

Так вам нужно понять где очищается.

TInterfacedObject._Release
....
Result := InterlockedDecrement(FRefCount);
  if Result = 0 then  Destroy;
....

Ставим бряк на destroy; После выхода попадаем IntfClear.
После выхода попадает либо в конец нужной процедуры\функции, либо
TObject.CleanupInstance;


 
vl_chel ©   (2006-09-05 14:02) [14]

Возможно гдето явно вызывается деструктор объекта, поэтому в деструкторе напиши первой строчкой
if RefCount <> 0 then Exit;



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

Форум: "Основная";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.038 c
2-1159273157
flaxe
2006-09-26 16:19
2006.10.15
GRID


15-1158819323
Курдль
2006-09-21 10:15
2006.10.15
Непересекающиеся периоды в БД.


2-1159647975
Ezorcist
2006-10-01 00:26
2006.10.15
ИИ для логической игры.


15-1159082637
AntiUser
2006-09-24 11:23
2006.10.15
Форум по Oracle?


3-1155305339
RomanH
2006-08-11 18:08
2006.10.15
Входной параметр в Хранимой процедуре





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский