Объясните пожалуйста про глюки с хуками.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Gigahard
Бывалый
Бывалый
 
Сообщения: 253
Зарегистрирован: 24.07.2002 (Ср) 11:15
Откуда: Russia

Объясните пожалуйста про глюки с хуками.

Сообщение Gigahard » 23.01.2006 (Пн) 17:46

Заметил, что установка хука, частенько вырубает IDE. Причем все закрывается без криков об ошибке и сохранения :cry: ...
Закономерность с которой это проявляется, я не выявил. Т.к. когда ставил хук в тестовом пустом проекте, IDE не вылетала. Добавлял код хука к существующему проекту, все работало прекрасно, но IDE вырубался с завершением работы программы :roll:. Т.е. отладить можно но только один раз :). А потом заново проект запускать. Сначала думал что косяки в коде, все закоментил, оставил только установку и снятие хука, все равно, после завершения отладки программы, IDE тоже закрывается. Может мне кто объяснить что это такое? Или хук и отладка, это несовместимые вещи?
Старый глюк лучше новых двух!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.01.2006 (Пн) 17:52

Какой хук?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Gigahard
Бывалый
Бывалый
 
Сообщения: 253
Зарегистрирован: 24.07.2002 (Ср) 11:15
Откуда: Russia

Сообщение Gigahard » 23.01.2006 (Пн) 18:14

Мышиный :)

Код: Выделить всё

Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Const GWL_WNDPROC = (-4)
Public Const WM_MOUSEWHEEL = &H20A
Dim PrevProc As Long

Public Sub HookForm(hwnd As Long)
    PrevProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Public Sub UnHookForm(hwnd As Long)
    SetWindowLong hwnd, GWL_WNDPROC, PrevProc
End Sub

Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   Select Case uMsg
   Case WM_MOUSEWHEEL
   'тра ля ля...
   End Select

    WindowProc = CallWindowProc( _
        PrevProc, hwnd, uMsg, wParam, lParam)
End Function
Старый глюк лучше новых двух!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.01.2006 (Пн) 18:19

Это называется сабклассинг (tyomitch, видишь? :) ).
Восстанавливать надо WindowProc перед тем, как закрывать или отлаживать проект.
Lasciate ogni speranza, voi ch'entrate.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 23.01.2006 (Пн) 18:29

То бишь, не вырубать через IDE.

Gigahard
Бывалый
Бывалый
 
Сообщения: 253
Зарегистрирован: 24.07.2002 (Ср) 11:15
Откуда: Russia

Сообщение Gigahard » 23.01.2006 (Пн) 20:58

Так я и не через IDE вырубаю... Форма через код выгружается и капут... Но не во всех случаях. Если я юзаю этот код в пустом проекте, то тогда все нормально. Но добавил к существующему, так там вылетает...


Восстанавливать надо WindowProc перед тем, как закрывать или отлаживать проект.
Т.е. unhook делать. Так я ж его на событие unload для формы ставлю... и судя по дебагеру оно обрабатывается, но после этого IDE все равно вылетает.
Старый глюк лучше новых двух!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.01.2006 (Вт) 7:33

Сабклассинг и отладка несовместимы.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Gigahard
Бывалый
Бывалый
 
Сообщения: 253
Зарегистрирован: 24.07.2002 (Ср) 11:15
Откуда: Russia

Сообщение Gigahard » 24.01.2006 (Вт) 14:50

Т.е. это не я не прав, а отладчик IDE глючный? :)

P.S. Кстати этот код из MSDN. А если это заменить на setWindowsHookEx, то глюк пропадет? Или там тот же эффект будет?
Старый глюк лучше новых двух!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.01.2006 (Вт) 15:29

Gigahard писал(а):Т.е. это не я не прав, а отладчик IDE глючный? :)

Не отладчик IDE глючный, а автор топика.
Если хочешь отладки, восстанавливай WndProc перед остановкой.
Lasciate ogni speranza, voi ch'entrate.

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 24.01.2006 (Вт) 16:14

Ну хочешь отладки, так понатыкай везде где надо
Debug.? Value :)
А вообще, если у тебя IDE вылетает после того, как ты закрыл форму стандартным способом, то это говорит о "прямоте" твоих рук :roll:
Если всё делать своими ручками, они скоро отвалятся !

Gigahard
Бывалый
Бывалый
 
Сообщения: 253
Зарегистрирован: 24.07.2002 (Ср) 11:15
Откуда: Russia

Сообщение Gigahard » 24.01.2006 (Вт) 16:56

Мдя... Попросишь объяснить в чем дело... а тебя глючным обзывают... :cry: 8)

Я не делаю остановки... Запускаю программу. Она выполняет свой код и закрывается. Не использую я брейкпоинты. Просто через IDE проект запускаю, а потом завершаю... По событию form_unload выполняется восстановление WndProc... Но IDE все равно закрывается...
Старый глюк лучше новых двух!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.01.2006 (Вт) 17:02

Приведи код полнее тогда.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Gigahard
Бывалый
Бывалый
 
Сообщения: 253
Зарегистрирован: 24.07.2002 (Ср) 11:15
Откуда: Russia

Сообщение Gigahard » 24.01.2006 (Вт) 17:03

Ну хочешь отладки, так понатыкай везде где надо
Debug.?

Мне не нужна отладка с остановками. Просто запуск программы на исполнение. Написал код, посмотрел, что работает через F5. Все.
А вообще, если у тебя IDE вылетает после того, как ты закрыл форму стандартным способом, то это говорит о "прямоте" твоих рук
А вообще если по существу вопроса сказать нечего, то нефиг рассуждать о прямоте чьих то рук ... :roll: :wink:
Старый глюк лучше новых двух!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.01.2006 (Вт) 17:04

Если ты останавливаешь проект из IDE, то никакого Form_Unload не бывает.
Lasciate ogni speranza, voi ch'entrate.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 24.01.2006 (Вт) 17:12

А для отладки можно код установки "хука" в класс положить, его снятия в class_terminate. Всё это в DLL. Подрубаем к проекту... При нажатии Stop код снятия "хука" будет выполнен 8)
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.01.2006 (Вт) 17:14

При нажатии Stop не происходит Class_Terminate.
Lasciate ogni speranza, voi ch'entrate.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 24.01.2006 (Вт) 17:22

Установщик хуков от Оловянникова видел? Там так и сделано!
Вообще при нажатии Stop IDE сама выгружает объекты из сторонних DLL.
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.01.2006 (Вт) 17:31

Внешняя COM-библиотека для сабклассинга?
Lasciate ogni speranza, voi ch'entrate.

Gigahard
Бывалый
Бывалый
 
Сообщения: 253
Зарегистрирован: 24.07.2002 (Ср) 11:15
Откуда: Russia

Сообщение Gigahard » 24.01.2006 (Вт) 17:54

Под остаовкой из IDE подразумевается нажатие кнопки stop или pause? Я НЕ управляю програмой этими кнопками. Из под IDE программа запускается, а дальше завершение программы происходит только через ее собственный код.
Кстати я нашел причину вылета IDE, но не совсем понятна как это связано с хуками и IDE...
Причину в студию?
Старый глюк лучше новых двух!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.01.2006 (Вт) 17:58

Да.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Gigahard
Бывалый
Бывалый
 
Сообщения: 253
Зарегистрирован: 24.07.2002 (Ср) 11:15
Откуда: Russia

Сообщение Gigahard » 24.01.2006 (Вт) 18:06

В общем если после восстановления WindowProc, т.е. снятие хука, мы выгружаем форму с помощью Unload Me, то все нормально. Если ставим глобальный конец программы, т.е. End, то прощай IDE с несохраненным проектом...

End я использовал в процедуре которая вызывалась в момент закрытия программы и освобождала все занятые ресурсы, а потом с помощью End безусловно заканчивала бы программу.

Естественно, что хук снимается перед оператором End, но причина вылета IDE после этого, мне не понятна.
Старый глюк лучше новых двух!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.01.2006 (Вт) 18:15

End не относится к числу операторов, достойных к применению.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Gigahard
Бывалый
Бывалый
 
Сообщения: 253
Зарегистрирован: 24.07.2002 (Ср) 11:15
Откуда: Russia

Сообщение Gigahard » 24.01.2006 (Вт) 18:59

Лучше кил процесс через API?

З.Ы. Значит все же IDE глючит :lol:
Старый глюк лучше новых двух!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.01.2006 (Вт) 19:03

Нет, он имеет ввиду, что End не нужен.
Если ты закрыл за собой все ресурсы, то программа сама завершит работу после выхода из последней процедуры.
Lasciate ogni speranza, voi ch'entrate.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 24.01.2006 (Вт) 19:22

alibek писал(а):Внешняя COM-библиотека для сабклассинга?

Внешняя COM-библиотека для сабклассинга в режиме отладки (дабы IDE не улетало :lol: ), а перед компиляцией DLL отключить, класс вставить, и всё.
Изображение

Gigahard
Бывалый
Бывалый
 
Сообщения: 253
Зарегистрирован: 24.07.2002 (Ср) 11:15
Откуда: Russia

Сообщение Gigahard » 24.01.2006 (Вт) 19:37

Ну это я для подстраховки... Контрольный выстрел так сказать :) А вообще чем лучше наверняка убить программу? Т.е. чтоб сразу все формы того... :roll:
Старый глюк лучше новых двух!

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 24.01.2006 (Вт) 19:44

Код: Выделить всё
Private Declare Sub ExitProcess lib "kernel32.dll" (ByVal uExitCode as Long)
ExitProcess 0

Но End - переходник к ExitProcess.
Изображение

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 24.01.2006 (Вт) 22:24

keks-n
Но ведь если мы выходим из процесса(а в IDE мы работаем как нить ВБ), то мы завершаем таким образом IDE :) или я неправ? :roll:
Если всё делать своими ручками, они скоро отвалятся !

Gigahard
Бывалый
Бывалый
 
Сообщения: 253
Зарегистрирован: 24.07.2002 (Ср) 11:15
Откуда: Russia

Сообщение Gigahard » 25.01.2006 (Ср) 10:51

С End все было бы понятно , если бы он давал бы такой результат и без хуков. Но только в таком сочетании он убивает IDE. Не ставить хук и он работает без проблем... А если хук использовать, даже с последующим снятием, то End ведет себя таким жлобским способом. 8)
Кстати вылет IDE происходит только если End содержится в одной процедуре со снятием хука или если в эта процедура вызывает другую в которой содержится End.
Если снятие хука и End разнесены по разным процедурам, то они уживаются.
К примеру если процедуру снятия хука повесить на кнопку, а не на form unload, а End поместить в form unload, то все нормально. Но стоит в тот же обработчик нажатия кнопки в след за unhook поместить End, как происходит вылет IDE.

В общем такое ощущение, что End срабатывает быстрее, чем снимается хук. По этому все и вылетает. Сейчас попробую сделать задержку между снятием хука и End'ом в рамках одной процедуры.

----------------

Задержка ничего не дает :) В общем не дружат снятие хука и End в одной процедуре...
Старый глюк лучше новых двух!

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 25.01.2006 (Ср) 15:50

А скачать SubClasser из кирпичей не дано?
Изображение

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот, Yandex-бот и гости: 159

    TopList