Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
 Аватар для erthalion
48 / 45 / 4
Регистрация: 29.03.2010
Сообщений: 233

Хук работает, пока работает приложение, которое его вызвало

04.03.2012, 15:44. Показов 1592. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Набросал код, который устанавливает глобальный хук (пусть на нажатие клавиши), процедура для хука расположена в dll, выглядит примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#pragma data_seg("SHARED")
HHOOK hook;
#pragma data_seg()
#pragma comment(linker, "/SECTION:SHARED,RWS")
 
HINSTANCE instance;
 
LRESULT CALLBACK WndHook(int code,WPARAM wParam,LPARAM lParam) {
        //some code
    return CallNextHookEx(hook, code, wParam, lParam);
}
 
extern "C" __declspec(dllexport) void installHook() {
    hook = SetWindowsHookEx(WH_KEYBOARD,WndHook, instance, 0);
    if(hook!=0){
        //error
    }
}
 
extern "C" __declspec(dllexport) BOOL APIENTRY DllMain( HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
    )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        instance=hModule;
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
Из другого приложения все это вызываю
C++
1
2
3
4
5
6
7
HINSTANCE library = LoadLibraryW(L"ISeeYouHook.dll"); 
if (library == NULL)
{
    return 1;
}
InstallHook install = (InstallHook) GetProcAddress(library, "installHook");
install();
Проблема в том, что хук почему-то живет, пока живет приложение, которое его вызвало и я никак не пойму, почему так происходит - может кто сказать, где я ошибся?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.03.2012, 15:44
Ответы с готовыми решениями:

Вызов DLL. Библиотека не удаляется, пока работает приложение
Здравствуйте. Такой вопрос. Вызываю функцию из DLL при помощи класса Assembly, вызов корректный, но потом не могу...

Приложение, которое работает с bmp Файлом
Пожалуйста помогите!!! Нужно написать программу, которая читает с диска *.bmp файл и выводит его в окно приложения. При помощи потока...

Приложение, которое работает как прокси-сервер http
Написать приложение, которое работает как прокси-сервер http. Должна быть возможность удаленного конфигурирования приложения в процессе...

5
 Аватар для thebvog
74 / 54 / 12
Регистрация: 20.02.2012
Сообщений: 239
05.03.2012, 18:16
erthalion, разве не так должно быть, вы загружаете из приложения библиотеку DLL, вызываете функцию и закрываете приложение, а после закрытия приложения, все ресурсы и загруженные им библиотеки освобождаются.
0
 Аватар для erthalion
48 / 45 / 4
Регистрация: 29.03.2010
Сообщений: 233
06.03.2012, 13:31  [ТС]
Да, я уже сам уловил это) Изначально почему-то в голове у меня застряло, что раз хук глобальный, то и жуть он должен долго и счастливо, пока не вызову Unhook --- хотя это, естественно, не так
0
 Аватар для thebvog
74 / 54 / 12
Регистрация: 20.02.2012
Сообщений: 239
06.03.2012, 17:32
erthalion, а почему бы тогда не сделать программку, которая висит в памяти, и в начале ставит крюк не из библиотеки, а из себя любимой
0
 Аватар для erthalion
48 / 45 / 4
Регистрация: 29.03.2010
Сообщений: 233
06.03.2012, 21:50  [ТС]
Был такой вариант, но мне показалось, что функционально он ничем не отличается от указанного мной подхода. Плюс в идеале надо вызывать CallNextHook, в параметры которого надо передать собственно хук - и сходу я не придумал способа, как это делать, если SetWindowHook будет вызываться из программы, а CallNextHook - из библиотеки. Если есть решения - буду рад послушать)
0
 Аватар для thebvog
74 / 54 / 12
Регистрация: 20.02.2012
Сообщений: 239
06.03.2012, 21:53
erthalion, а почему бы все функции из библиотеки не вставить просто в программу, или зациклить программу, которая запускает библиотеку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.03.2012, 21:53
Помогаю со студенческими работами здесь

Приложение работает в Debug, странно работает в Release и не работает при билде
Действия выполняются на эмуляторе Pixel 2. Android 9.0. Если я запускаю приложение с конфигурацией Debug, то всё в порядке. При запуске же...

Граф. приложение+библиотеки+консольное приложение! Не работает программа без использования консоли. Если использую, то всё прекрасно работает.
Ребята нужна помощь,все вроде сделал, но приложение начинает зависать при запуске без использования консоли, если использую ее то все...

Какие материалы нужно изучить чтобы создать приложение которое работает с информацией на сайте
Здравствуйте! Хочу создать програмку, которая по сайту новостей ходит и если добавлена новая новость, то она меня об этом уведомляет :) ...

Написать приложение (с использованием семафора), которое не дает закрыть любой exe файл, пока запущено
Написать приложение с использованием семафора, которое пока запущено не дает закрыть exe файл( любой). При попытке закрыть exe приложение...

Передать значение в свойство окна, которое вызвало данное окно?
Передать значение в свойство окна, которое вызвало данное окно? Я вызываю форму следующем образом Settings ^S = gcnew Settings(); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru