Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-6027
h0use
2004-02-16 16:21
2004.03.03
Непонятное поведение Делфи


3-5961
olegus
2004-02-06 15:47
2004.03.03
Ошибка доступа


1-6127
Builder
2004-01-23 13:36
2004.03.03
Excel


1-6154
Mishenka
2004-02-18 21:34
2004.03.03
Как переконвертировать BMP в GIF ???


1-6146
novi
2004-02-21 18:54
2004.03.03
Как удалить пробелы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский