// Вопрос поднимся уже, и не раз.
// Я прочитал весь форум внимательно, все статьи и посты на эту темы, MSDN тоже,
// потратил два дня на это, поэтому писать снова не стыдно
Вопрос: я хочу поставить глобальный Mouse Hook.
Что я делаю неверно?
Возможно, наводящим вопросом будет:
Хук устанавливается, но не работает.
При попытке его освободить, говорит "Неверный дескриптор обработчика"
(Это при анализе GetLastError())
//---------------------------------------------------------------------------
// Проект
//---------------------------------------------------------------------------
Здравствуйте, Lonely Dog, Вы писали:
LD>Здравствуйте, spazhev_dima, Вы писали:
LD>Правильно ли я понимаю, что сегмент данных DIMA расшарен? В таком случае, мне не понятно, почему переменная hHook не в этом сегменте?
Дык потому что хук, НАСКОЛЬКО Я ПОНИМАЮ, свой для каждого приложения...
И инстанс длл-ки тоже.
LD>>Здравствуйте, spazhev_dima, Вы писали:
LD>>Правильно ли я понимаю, что сегмент данных DIMA расшарен? В таком случае, мне не понятно, почему переменная hHook не в этом сегменте?
_>Дык потому что хук, НАСКОЛЬКО Я ПОНИМАЮ, свой для каждого приложения... _>И инстанс длл-ки тоже.
Это все очень мило, правда...
Но хотелось бы ответа. А не ребусы.
К стати, по существу вопроса, в моем случае неважно, что попадает в процедуру CallNextHookEx,
потому что при отладке видно, что вообще в процедуру обработки хука (мою) управление не передается вообще никогда.
Хотя хук ставится (при его установке {Set..Ex} возвращается указатель на него, в GetLastError тишина...)
Вот... Что, никто не хочет помочь?
// Флуд: я сам сильно удивлен, что не работает. уже все перепробовал. ужас какой-то.
Здравствуйте, spazhev_dima, Вы писали:
_>К стати, по существу вопроса, в моем случае неважно, что попадает в процедуру CallNextHookEx, _>потому что при отладке видно, что вообще в процедуру обработки хука (мою) управление не передается вообще никогда.
Возможно, что ваша DLL не может быть загружена в другие процессы, поскольку зависит от других DLL, которых нет в стандартных каталогах, где ищет система (PATH, system32, и так далее). Список DLL, от которых зависит ваша DLL вы легко можете получить с помощью утилиты depends.exe из Platform SDK.
AS>>>>Ну так и что тогда попадает в CallNextHookEx?
AF>>>NULL.
AS>>Продолжим AS>>И что в этом случае будет на 9х?
AF>А мне все равно. Автору вопроса, скорее всего, тоже.
AF>Это я к тому, что замечание про HHOOK конечно же верное, но оно не отвечает на вопросы автора.
Частично — отвечает. Все складывается из мелочей. Например, кто там видет, что сегмент разделяемый? А ведь автора уже спрашивали об этом.
_>Это все очень мило, правда... _>Но хотелось бы ответа. А не ребусы.
Да уж. Видимо, Сократ для вас не авторитет
_>К стати, по существу вопроса, в моем случае неважно, что попадает в процедуру CallNextHookEx, _>потому что при отладке видно, что вообще в процедуру обработки хука (мою) управление не передается вообще никогда.
При отладке? А каким же способом вы отлаживаете? Вызовов Trace или OutputDebugString у вас в коде я не обнаружил.
_>Хотя хук ставится (при его установке {Set..Ex} возвращается указатель на него, в GetLastError тишина...)
_>Вот... Что, никто не хочет помочь?
В первую очередь, должны хотеть помочь себе вы. Для этого надо прочитать имеющиеся на сайте статьи и сделать соответствующие выводы. Пока что я вижу только удивленные восклицания, а не желание разобраться самостоятельно.
Здравствуйте, Alex Fedotov, Вы писали:
AF>Возможно, что ваша DLL не может быть загружена в другие процессы, поскольку зависит от других DLL, которых нет в стандартных каталогах, где ищет система (PATH, system32, и так далее). Список DLL, от которых зависит ваша DLL вы легко можете получить с помощью утилиты depends.exe из Platform SDK.
Проверил. Не зависит.
Переписал ее полностью на С, без использовании вообще чего-то Билдерововского.
AF>>Возможно, что ваша DLL не может быть загружена в другие процессы, поскольку зависит от других DLL, которых нет в стандартных каталогах, где ищет система (PATH, system32, и так далее). Список DLL, от которых зависит ваша DLL вы легко можете получить с помощью утилиты depends.exe из Platform SDK.
_>Проверил. Не зависит. _>Переписал ее полностью на С, без использовании вообще чего-то Билдерововского.
_>Работать не стало
_>>потому что при отладке видно, что вообще в процедуру обработки хука (мою) управление не передается вообще никогда. AS>При отладке? А каким же способом вы отлаживаете? Вызовов Trace или OutputDebugString у вас в коде я не обнаружил.
Отлаживать dll'ки можно в среде VC++, например. Это не есть проблема.
AS>В первую очередь, должны хотеть помочь себе вы. Для этого надо прочитать имеющиеся на сайте статьи и сделать соответствующие выводы. Пока что я вижу только удивленные восклицания, а не желание разобраться самостоятельно.
_>>>потому что при отладке видно, что вообще в процедуру обработки хука (мою) управление не передается вообще никогда. AS>>При отладке? А каким же способом вы отлаживаете? Вызовов Trace или OutputDebugString у вас в коде я не обнаружил.
А>Отлаживать dll'ки можно в среде VC++, например. Это не есть проблема.
Которые загружены непонятно в какой процесс? Интересный вариант
AS>>В первую очередь, должны хотеть помочь себе вы. Для этого надо прочитать имеющиеся на сайте статьи и сделать соответствующие выводы. Пока что я вижу только удивленные восклицания, а не желание разобраться самостоятельно.
А>Согласен. Похоже на тролля, кстати.
А>>Отлаживать dll'ки можно в среде VC++, например. Это не есть проблема. AS>Которые загружены непонятно в какой процесс? Интересный вариант
Почему же "непонятно в какой"? В качестве Executable for debug session прописываешь приложение, которое в любом случае подцепит dll'ку и вперёд. А можно и к уже существующему процессу приаттачиться. Уж сколько раз так делал, не вижу проблемы. Главное, не забыть бряки где надо расставить.
AF>Возможно, что ваша DLL не может быть загружена в другие процессы, поскольку зависит от других DLL, которых нет в стандартных каталогах, где ищет система (PATH, system32, и так далее).
AS>Все складывается из мелочей. Например, кто там видет, что сегмент разделяемый? А ведь автора уже спрашивали об этом.
Похоже, ошибка как раз в разделяемом сегменте. Я их не делал никогда, код взял из примера. Я же под Билдером работаю... А примерчек, кохоже, с Visual Studio:
Здравствуйте, spazhev_dima, Вы писали:
_>Похоже, ошибка как раз в разделяемом сегменте. Я их не делал никогда, код взял из примера. Я же под Билдером работаю... А примерчек, кохоже, с Visual Studio:
_>#pragma data_seg(".DIMA") _>HWND hWnd = NULL; _>HHOOK hHOOK = NULL; _>#pragma data_seg()
_>В общем, надо изучить, как делаются разделяемые сегменты данных в Builder 6