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

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

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

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

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

16 ответов

43 просмотра

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.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта