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

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

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

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

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

16 ответов

22 просмотра

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.

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

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

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
70
Хотел бы спросить у знающих, правильную ли я выбрал книгу для начала изучения ассемблера Юрова В.И ? Или есть более лучшие книги для начала обучения?
Botsman
25
Книга Юрова В.И пойдёт для обучения?
Botsman
24
Люди добрые, помогите с идеями, потому что свои закончились. У клиента падает софтина в момент инициализации модуля OtlEventMonitor на RegisterWindowMessage('Gp/OtlTaskEvents/...
Михаил Усков
7
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
> Примечательно, что новый владелец удаляет из GitHub любые жалобы, указывающие на подозрительную активность или смену владельца, и, видимо, рассчитывает на то, что пользовате...
Alex Sherbakov
2
GridView fully ignored first parent(SizedBox), and take width from second parent(Container). How can I constrain GridView by first parent? Widget build(BuildContext context) {...
Hamster
1
Hey there Which is the best Linux destro for developers (coding)? To my research on reddit, they said Linux mint is good for mid level spec and Ubuntu for high Lev hardwar...
Wiz 🪄
11
И ещё вопрос: можно ли типа как на дос как-то запариться и с помощью прерываний выводить текст, вместо функции printf ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
34
а мы ещё не созрели до того, чтобы создать отдельный чатик про настройку редакторов?
Cheese Syrowiecki
16
Карта сайта