169 похожих чатов

Проблема с Windows scripting control Множество объектов получают iDispatch обертки и

отдаются в скрипты. При этом скрипты могут эти обертки держать живыми очень долго, например положив в глоьальную переменную. Ну а jscript их вообще никогда не освобождает.

Возникает вопрос о зомби-состоянии, чтобы обёртка знала, что её объекта больше не существует.

С компонентами понятно, там free notification есть. А вот например tcollection или tstrings - там ни фига такого нет... Как им задним числом добавить проперть ondestroy? Пересобрать rtlXXX.bpl и всех остальных не предлагайте. Я ***нутый, но не настолько ещё

16 ответов

21 просмотр

1) Смотрел другие обертки? 2) В указанных тобой контейнерах есть методы/события о удалении итемов, можно реагировать когда удаляться последний элемент, ТК у них(контейнеров) в Destroy вызываеться Clear. В комбинации с Component State полисам желание. Без Delphi под рукой, но выглядит похоже на желаемое. 3) наследник и хук RTL чтобы создавал наследников, вместо оригиналов, примеры есть.

Arioch-The Автор вопроса
Alexey Gavrilov
1) Смотрел другие обертки? 2) В указанных тобой ко...

нет, придется много легаси переписывать, время никто не даст. Кроме того, это ничего не решит: и в VBS и в JS есть глобальные переменные 2) обертка не поверх итема, а повех самой коллекции! Обертка над Strings[1] - это просто переменная типа Variant, в которую скопировали строку. Не о чем говорить. А вот что делать, когда объект TStrings удалили, а потом обертка пытается из него что-то прочитать? 3) вариант интересный, если бы был исчерпывающий список таких классов, чтобы над каждым ищ них делать наследника. Но скрипт может получить доступ к любому published свойству и через него к любому дельфи-объекту, которые такое свойство вернет... То есть потенциально надо хукать и создавать наследников для ВСЕХ существующие классов, это жестоко. Лучше уж TObject хукать один раз 😊

Arioch The
нет, придется много легаси переписывать, время ни...

П1 про то, что может решали такие вопросы. Я вот, например TStrings не отдавал, там же спецом своя интерфейсная коллекция есть, и обёртка для нее в RTL. С п2 я думал, что тебе для TCollection и TStrings onDestroy нужен.

Arioch-The Автор вопроса
Arioch-The Автор вопроса
Alexey Gavrilov
П1 про то, что может решали такие вопросы. Я вот, ...

ну и например TDataSet - Fields, FieldDefs, Parameters - все это коллекции и так просто ты вместо них потомка не подсунешь 😊

Arioch The
потенциально любой объект...

Потом, там же все одно взаимодействие не напрямую идёт. Объекты же регистрируются.

Arioch-The Автор вопроса
Alexey Gavrilov
Потом, там же все одно взаимодействие не напрямую ...

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

Arioch The
не объекты, а твои обертки, в этом и проблема... т...

Ладно, давай так, я подниму старые архивы, посмотрю, что там, На мой взгляд, добавить/эмулировать onDestroy можно для любого объекта. Пропатчив FreeInstance, например. Мб интерфейс добавить придеться.

Arioch-The Автор вопроса
Alexey Gavrilov
Ладно, давай так, я подниму старые архивы, посмотр...

так про пропатчить freeinstance я и сам говорил 😃 😃 😃 с него родного и начали

Arioch-The Автор вопроса
Alexey Gavrilov
Ладно, давай так, я подниму старые архивы, посмотр...

https://t.me/Delphi_Lazarus/323688 дык, ты же примерно это предложишь 😊

Arioch-The Автор вопроса
Alexey Gavrilov
Ну, плюс/минус 😁

можно ещё тупо вести TObjectList для каждого класса в отдельности, создавая в рантайме классам проперти, и туда закладывая эту коллекцию, если она потребуется плюс - не придется добавлять 4 байта каждому объекту минус - удаление оскриптованного объекта станет заметно медленнее что лучше - я хз, так пока лениво в фоне перебираю варианты

Arioch The
можно ещё тупо вести TObjectList для каждого класс...

С другой стороны где MSC и где скорость... PAXCOMPILER уже умер. Но у него был и JavaScript.

Arioch The
https://t.me/Delphi_Lazarus/323688 дык, ты же при...

uses Spring.VirtualClass; procedure NotifyFree(const Self: TObject); var freeInstance: TFreeInstance; begin freeInstance := GetClassData(Self.ClassParent).FreeInstance; Writeln('Object of class ', Self.ClassName, ' destroyed'); freeInstance(Self); end; var vc: TVirtualClasses; o: TObject; begin vc := TVirtualClasses.Create; try o := TObject.Create; try vc.Proxify(o); GetClassData(o.ClassType).FreeInstance := NotifyFree; finally o.Free; end; finally vc.Free; end; end.

Arioch The
можно ещё тупо вести TObjectList для каждого класс...

uses Spring.VirtualClass; procedure NotifyFree(const Self: TObject); var freeInstance: TFreeInstance; begin freeInstance := GetClassData(Self.ClassParent).FreeInstance; Writeln('Object of class ', Self.ClassName, ' destroyed'); freeInstance(Self); end; var vc: TVirtualClasses; o: TObject; begin vc := TVirtualClasses.Create; try o := TObject.Create; try vc.Proxify(o); GetClassData(o.ClassType).FreeInstance := NotifyFree; finally o.Free; end; finally vc.Free; end; end.

Похожие вопросы

Обсуждают сегодня

@Aiwan что такое база образца?
Alexey
27
Не многие знают, а кто знает, тот уже успел забыть, что в далёком 2004 году эта игра произвела настоящий фурор, настолько революционной была технология, применяемая для её соз...
ICCID
4
Короче я тут узнал полный пиздец Что кучу постов которые я создавал через posted Спустя время не могу редактировать и менять Мол телега возвращае ошибку Это реально так ...
inc.
13
коллеги, добрый вечер! А никто не знает как модальная форма может себя закрыть? Ну допустим модальная форма определила, что смысла ей работать нет и хочет вернуть modalResult...
Михаил
83
Хотя у меня сейчас есть более сложная задача, вот её думаю: как объяснить челу переходного возраста противоположного полу, обучающегося в польском колледже (а-ля наш техникум)...
Вячеслав Кузьменко
15
а вы в курсе, что Initialize() не работает? var arr123: array[0..123] of Byte; ... Initialize(arr123, SizeOf(arr123));
Iluha Companets
8
Добрый день Хочу начать обучение языку, не являюсь представителем it, буду благодарна за помощь, совсем пока не понимаю ничего) Подскажите, пожалуйста, где можно начать первы...
Sara Lala
30
что читать по делфи?вообще 0 в нем
fd dsds
9
верно что я могу удалить эти addq и subq т.к. со стеком никакого взаимодействия нет (исключая call)?
Michael
16
const dirname = new URL((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.src || new UR...
Kirill Shaplyko
4
Карта сайта