carrots писал(а):Спасибо MageSlayer,
но если я тебя правельно понял - в этих решениях есть ряд недопустимых недостатков.
В первом:
1.Этот метод будет работать только со специальными компонентами — это не допустимо.
Точно.
carrots писал(а):2.Будет очень сложно объяснить разработчику плагина как именно он должен переписать свои компоненты.
Хм. Странно. Компоненты в плагинах. Я почему-то подумал, что ситуация как наоборот, дать возможность делать подписку на события хоста.
carrots писал(а):3.Это повлечет за собой много дополнительной работы.
При большом количестве компонент для адаптации - да.
carrots писал(а):Относительно второго варианта:
В том то и стоит вопрос что мы не знаем как “выкусывать список параметров из стека и регистров” и как их передать в нужную нам функцию.
В случае "публикации" хостовых событий, условно говоря, хэшем типа события выступает адрес процедуры, которая которая дергает это событие. Клиент так или иначе стандартным способом подписаться на событие уже не может.
carrots писал(а):Выше я описывал более проще и гибче первого варианта:
Скорее всего - да.
carrots писал(а):Если к нужному событию не присвоена процедура диспетчер - мы ее просто присваиваем
Так что можно обрабатывать абсолютно все объекты и все события, но если кто-то создаст свой тип события - на него нужно будет создавать еще функцию диспетчер, что добавляет хлопот.
Потому стоит вопрос о создании универсальной функции диспетчере которая будет работать со всеми типами событий.
Собственно по ходу обдумывания второго варианта на ум пришел и третий.
Тоже хак, но еще более простой и надежный чем третий.
У нас проблема - как выкусить параметры. Так? Ок. Только на самом деле нам это не нужно, нам просто нужно "передать эти параметры" другим процедурам. Итак, сам хак - вместо того, чтобы пытаться узнать сколько параметров у процедуры-обработчика, то есть сколько параметров передал нам неизвестный компонент, можно просто скопировать все регистры и стек с запасом. Например, все регистры (в случае fastcall) и кусок стека, скажем байт 200. В таком случае, нам не нужно думать о том, что за параметры у события, какой их тип и т.д. И параметр настройки у алгоритма всего один - какой размер стека считать достаточным.
Разумеется, что придется вручную балансировать стек при выходе из процедуры-обработчика, но это легко - просто отправлять стек на то, место которое было перед копированием параметров. Ну и возможно придется сохранить все измененные регистры до вызова и восстановить после. Тоже ничего военного.
P.S. Третий вариант для лентяев типа меня