Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.12.2008, 14:55   #1
Tihon
Пользователь
 
Регистрация: 18.12.2007
Сообщений: 40
По умолчанию Отладка dll с хуком или Мистика на марше

Есть тестовое приложение. Устанавливается глобальный хук и каждые 20 символов a-z скидывает в лог.

Все так и происходит... почти. Хук устанавливается, это точно. Срабатывает не после 20, а после 2 символов и не пишет в лог. Начинаю отладку (проект на D6 прилагаю).
На картинке - окно редактора. Для контроля записи в лог-файл использовал MessageDlg, который вы видите на картинке. Включил точку останова перед выдачей сообщения.

Ожидается, что как только сработает хук, появится сообщение о записи...

Здесь начинается мистика. После каждого второго символа выскакивает сообщение о записи. Но - лог-файл отсутствует, и мало того - не срабатывает breakpoint (см. картинку)!!! То есть, ж...а есть, а слова нету, как в анекдоте. Точки останова включены до запуска приложения, и в других местах благополучно тормозят исполнение.

Извините за тупость, не понимаю, откуда берется сообщение, если исполнение не проходит через GlobalKeyBoardHook... А ведь не проходит же...
Помогите, посмотрите приложение...

................................
Начинаю догадываться. DLL-ка загружена динамически.
Но как тогда отлаживаться?!
Изображения
Тип файла: jpg Фрагмент окна.jpg (46.3 Кб, 131 просмотров)
Вложения
Тип файла: rar Hook1.rar (352.2 Кб, 12 просмотров)

Последний раз редактировалось Tihon; 31.12.2008 в 15:11. Причина: уточнение
Tihon вне форума Ответить с цитированием
Старый 31.12.2008, 15:13   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

давай код и картинку.
точка останова не срабатывает из-за того что твоя DLL грузится во все GUI процессы, а Delphi отлавливает точки останова только в твоём приложении.
rpy3uH вне форума Ответить с цитированием
Старый 31.12.2008, 15:23   #3
Tihon
Пользователь
 
Регистрация: 18.12.2007
Сообщений: 40
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
давай код и картинку.
точка останова не срабатывает из-за того что твоя DLL грузится во все GUI процессы, а Delphi отлавливает точки останова только в твоём приложении.
Приложено... Я догадался, да-с... Как определить, почему не 20 символов, а только 2?
Tihon вне форума Ответить с цитированием
Старый 31.12.2008, 16:15   #4
Tihon
Пользователь
 
Регистрация: 18.12.2007
Сообщений: 40
По умолчанию

Цитата:
Сообщение от Tihon Посмотреть сообщение
Приложено... Я догадался, да-с... Как определить, почему не 20 символов, а только 2?
Вот нашел на форуме ProgZ по поводу точек останова в DLL:
"malamut26.11.2007, 0:38
Реально. И намного проще. Если не хочешь так много запариваться, то понятное дело в Run->Parametrs dll указываешь программу, которая использует dll. Потом компилишь одно, другое. Затем запускаешь из проекта dll'ки, и когда она будет загружена (основная прога сделала LoadDll или чего-то типа того), то в дельфях нажимай Ctrl+Alt+M, там в списке dll выбирай свою, правой кнопкой, Reload Symbol Table, и указываешь путь к файлу dll.
Всё, теперь должны все брейкпойнты работать как часы "

Счас буду пробовать.
Tihon вне форума Ответить с цитированием
Старый 31.12.2008, 16:33   #5
0nni
Форумчанин
 
Аватар для 0nni
 
Регистрация: 24.07.2008
Сообщений: 279
По умолчанию

Я для отладки консоль использую.
Сказал и загрустил от бесспорности своей правоты.
0nni вне форума Ответить с цитированием
Старый 31.12.2008, 17:28   #6
Tihon
Пользователь
 
Регистрация: 18.12.2007
Сообщений: 40
По умолчанию

Цитата:
Сообщение от 0nni Посмотреть сообщение
Я для отладки консоль использую.
Каким образом?
Я с Debug Windows -> Modules не вполне врубаюсь... Моя Dll загружена, остановы ставлю, - один хрен, не работают...

Есть здесь какая-то тайна
Короче, всех с Новым Годом, господа!

Завтра, с утречка, со свежей головой, - пробьемся!
Tihon вне форума Ответить с цитированием
Старый 31.12.2008, 19:30   #7
0nni
Форумчанин
 
Аватар для 0nni
 
Регистрация: 24.07.2008
Сообщений: 279
По умолчанию

AllocConsole() и пошел - Write()\WriteLl().
Да все, всем всего.
Завтра насоветуем =)
Сказал и загрустил от бесспорности своей правоты.
0nni вне форума Ответить с цитированием
Старый 02.01.2009, 12:39   #8
Tihon
Пользователь
 
Регистрация: 18.12.2007
Сообщений: 40
По умолчанию

Цитата:
Сообщение от 0nni Посмотреть сообщение
AllocConsole() и пошел - Write()\WriteLl().
Да все, всем всего.
Завтра насоветуем =)
Ну вот, allocconsole я видел... Только не очень врубаюсь, чем оно отличается от ShowMessage - останов все равно не работает, и не отследить никак функцию GlobalKeyBoardHook, как ни крутись...

И, конечно, с наступившим Новым Годом. Все таки, Бык - не какая-то Крыса...
Tihon вне форума Ответить с цитированием
Старый 02.01.2009, 13:55   #9
0nni
Форумчанин
 
Аватар для 0nni
 
Регистрация: 24.07.2008
Сообщений: 279
По умолчанию

В консоль можно выводить значения в реальном времени. для меня это кажется намного удобнее чем все время жать ок.
А вообще ставить брекпоинты внутри хука - чревато.
Сказал и загрустил от бесспорности своей правоты.
0nni вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
.dll или .so для php mv28jam PHP 3 08.12.2008 16:20
Проблема с хуком, Делаю подмену клавиш мыши zhefran Win Api 12 17.04.2008 18:03
DLL или как работать со стороней программой??? nimf Общие вопросы Delphi 2 15.04.2008 17:11
мистика в delphi steck Общие вопросы Delphi 4 27.03.2007 23:57