Форум: "Основная";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c