Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.03;
Скачать: CL | DM;

Вниз

OnDblClick из DLL   Найти похожие ветки 

 
Дядя   (2004-02-19 11:07) [0]

Приветствую всех! Вопросами DLL никогда не занимался, а племянник мне, как старому программисту, задал вопрос.. Если, кто разбирается в этом, помогите с ответом.

А вопрос, примерно, такой: как в DLL заложить реакцию на воздействие на внешнюю (то есть, не из DLL) форму, например, обработать для неё ситуацию OnDblClick?

Можно ли, к примеру, вторгнуться в форму из DLL с помощью процедуры с параметром Sender посредством with Sender as TForm и с уточнением, типа, if Name="Form1" then..?
Правда, не понятно, форму, вроде бы, можно отловить, но само событие DoubleClick..

P.S. Ничччего не понимаю. Ну и вопросы у детей.. :)


 
Юрий Зотов ©   (2004-02-19 11:58) [1]

Не вдаваясь в детали (их слишком много), приведу самое простое решение - написать обработчик DblClick все же в самой форме (то есть, в EXE), а вот в уже нем можно вызывать любую функцию из DLL с любыми параметрами.


 
Дед   (2004-02-19 12:08) [2]

Это-то понятно.. Но мало ли что. Может возникла такая ситуация, например, что изначально это (DoubleClick) не предусмотрено, а потом добавляется через DLL или её модификацию.


 
Юрий Зотов ©   (2004-02-19 12:12) [3]

> Дед (19.02.04 12:08) [2]

Уточненяющий вопрос - это "потом добавляется" приведет к необходимости перекомпиляции EXE, DLL или их обоих?


 
Дед   (2004-02-19 12:21) [4]


> Юрий Зотов

Ну, я думаю, что племянник делает DLL отдельно от EXE, и следует рассматривать вариант, что EXE не трогаем, а компилируем только DLL.

А ещё я думаю, что это ерунда. На троянского коня похоже. Не в смысле злого умысла, а в смысле подхода к делу.


 
Юрий Зотов ©   (2004-02-19 12:25) [5]

> Дед (19.02.04 12:21) [4]

Если в DLL заложить глобальный хук и загрузить эту DLL любой вспомогательной программой, то этот хук сможет перехватить любые сообщения мыши.


 
Дед   (2004-02-19 12:37) [6]

Аха.. Уже теплее. Только надо не любые. Скорее предпочтительнее только той самой EXE. Видимо, DLL будет всё-таки запускаться из этой EXE, как в таком случае определить, откуда она вылупилась? В том смысле, чтобы понять, на той ли форме она будет реагировать на мышь? А то, ведь, имя формы - вещь не уникальная..

А без глобализации никак? :-)


 
Юрий Зотов ©   (2004-02-19 12:47) [7]

> Дед (19.02.04 12:37) [6]
> Только надо не любые. Скорее предпочтительнее только той самой
> EXE. Видимо, DLL будет всё-таки запускаться из этой EXE, как в
> таком случае определить, откуда она вылупилась? В том смысле,
> чтобы понять, на той ли форме она будет реагировать на мышь? А
> то, ведь, имя формы - вещь не уникальная..

Вся информация сидит в самом сообщении. Хук всегда может ее проанализировать и узнать, что и где произошло.

> А без глобализации никак? :-)

Если DLL будет запускаться тем же самым EXE - то запросто (и DLL даже получится намного проще). Если другим - то никак.

Только, раз уж DLL будет запускаться тем же самым EXE - то не проще ли заранее в этом самом Exe предусмотреть вызов каких-то функций DLL с заведомо заданными именами и списком параметров? А после этого никто не мешает заменять одну DLL на другую без перекомпиляции Exe.


 
Дед   (2004-02-19 12:55) [8]


> Юрий Зотов

Понимаешь, проще ваще с DLL не связываться! :-) Писать сразу:

procedure TForm1.FormDblClick(Sender: TObject);
begin
{ а изголяться здесь }
end;


Но, коли уж вопрос так стоит.. Мы ж, вроде, договорились, что EXE трансляции не подлежит. Мало ли, исходников нет..

И как ты предполагаешь этот хук рисовать? Дядя же племяннику не будет так отвечать: мол, сделай хук и будет тебе счастье. Надо бы поконкретней, но без лишних деталей. Смысли, думаешь IP использовать, прерывание по мыши?


 
Юрий Зотов ©   (2004-02-19 14:02) [9]

> Дед (19.02.04 12:55) [8]

> Понимаешь, проще ваще с DLL не связываться! :-) Писать сразу:

См. [1]. Этот вариант не подошел из-за:

> Дед (19.02.04 12:21) [4]
> следует рассматривать вариант, что EXE не трогаем, а
> компилируем только DLL.

Тогда было предложено решение [5] с глобальным хуком. Но почему-то тут же стало так:

> Дед (19.02.04 12:37) [6]
> Видимо, DLL будет всё-таки запускаться из этой EXE

Что противоречит сказаному ранее в [4]. Ладно, тогда в [7] было сказано, что в таком случае хук может быть и локальным, но тогда уж проще обойтись совсем без хуков и вернуться к варианту [1]. В ответ на что снова все меняется:

> Дед (19.02.04 12:55) [8]
> Мы ж, вроде, договорились, что EXE трансляции не подлежит.
> Мало ли, исходников нет..

Что противоречит сказаному ранее в [6] и возвращает к варианту [5]. И возникает вопрос - извините, мы и дальше будем играть в сказку про белого бычка, или все же стоит как-то определиться?

=========================

> И как ты предполагаешь этот хук рисовать? Дядя же племяннику
> не будет так отвечать: мол, сделай хук и будет тебе счастье.
> Надо бы поконкретней, но без лишних деталей. Смысли, думаешь
> IP использовать, прерывание по мыши?

Я предполагаю рисовать этот хук так:

1. В SDK изучить описание SetWindowsHookEx и родственных функций.
2. На этом сайте найти статью Алексея Павлова по глобальным хукам и изучить ее тоже.
3. Сесть и нарисовать хук. Без всяких прерываний. Тем более, что Win32 к ним и не допустит.


 
Дед   (2004-02-19 14:16) [10]


> Юрий Зотов

Юра, фраза "Понимаешь, проще ваще с DLL не связываться! :-)" - это шутка юмора такая была. У нас на Урале три символа вместе ":-)" означают улыбку. Поэтому белого бычка нету.

Понятно, что задачка непростая. Более того, я вместе с тобой согласен, что такая обработка события в DLL неверна в корне, и, действительно, она оправдана только в том случае, если очень хочется, но исходников к EXE нет.

Что такое Хук и как с ним бороться я не знаю, поэтому благоразумно завяну. Может кто-нибудь ещё что-то сможет предложить дяде. Вообще-то, надо бы помочь бы, ведь, это, как его, профессиональная, чего там, консолидация. :-)



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

Текущий архив: 2004.03.03;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.017 c
3-5992
Andrey V.
2004-02-03 20:05
2004.03.03
Гибкая уникальность


1-6061
BlackTiger
2004-02-17 18:10
2004.03.03
Как узнать ПРЕДЫДУЩИЙ активный контрол?


3-5976
Карелин Артем
2004-02-05 12:25
2004.03.03
Структура таблиц для поисковика на FireBird.


1-6114
roadstar
2004-02-20 18:00
2004.03.03
Про компиляцию...


3-5981
Lisa
2004-02-04 13:55
2004.03.03
в DBGrid не работает мышинный скроллинг