Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
подмена оконной процедуры - крах приложения
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, помогите, пожалуйста, что то никак не могу ухватить что не так сделал. Есть задача: научить приложение VBA (Access) реагировать на сообщение пользователя (управление внешней программой). Для этого была сделана DLL, подменяющая оконную процедуру и долженствующая вызвать некоторую функцию при приходе сообщения UserMsg. DLL имеет три используемые в данном случе функции: NewDialogProc, SetNewProc и int Init. Init (просто для сведения привел - там вроде все правильно работает) регистрирует UserMsg. SetNewProc - подменяет оконную процедуру. NewDialogProc - новая процедура. Ее цель - обеспечить отдельную обработку UserMsg. При отладке на простеньком MFC приложении обнаружился вылет через долю секунды после запуска. При пошаговом исполнении оказалось, что происходит переполнение стека и через 10-15 обработанных сообщений стек рушится. Думаю, я что-то очевидно не так сделал, но сам не могу сообразить что. Подскажите плс, куда копать? PS: на данном этапе выполнения условие Msg==UserMsg не выполняется, то есть фактически в NewDialogProc выполняется только строка "return OldFunct(hWnd,Msg,wParam,lParam);". Код: plaintext 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. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2014, 10:00 |
|
||
|
подмена оконной процедуры - крах приложения
|
|||
|---|---|---|---|
|
#18+
Не надо свою очередь делать. Читай про хуки http://www.rsdn.ru/article/baseserv/winhooks.xml ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2014, 10:16 |
|
||
|
подмена оконной процедуры - крах приложения
|
|||
|---|---|---|---|
|
#18+
Спасибо, но думаю хуками сложней и не удобно. Мне надо в своем процессе просто сделать предобработчик событий и все. Хуки, как мне думается, скорее для слежения за чужим процессом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2014, 10:53 |
|
||
|
подмена оконной процедуры - крах приложения
|
|||
|---|---|---|---|
|
#18+
Все, всем спасибо, вопрос закрыт: упустил описание CALLBACK в оконных процедурах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2014, 11:42 |
|
||
|
подмена оконной процедуры - крах приложения
|
|||
|---|---|---|---|
|
#18+
iMerlin, Код: plaintext 1. Регистрировать сообщение вовсе не обязательно. Это нужно ТОЛЬКО тогда, когда сообщение посылается между окнами разных приложений. В таком случае регистрация сообщения гарантирует, что идентификатор сообщения будет один и тот же в этих приложениях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2014, 14:44 |
|
||
|
подмена оконной процедуры - крах приложения
|
|||
|---|---|---|---|
|
#18+
iMerlin Код: plaintext 1. Сигнатура этой функции должна быть такой: LRESULT (CALLBACK* WNDPROC) (HWND, UINT, WPARAM, LPARAM); DWORD и LRESULT не всегда одно и то же. Про CALLBACK ты уже заметил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2014, 14:52 |
|
||
|
подмена оконной процедуры - крах приложения
|
|||
|---|---|---|---|
|
#18+
MasterZiviMerlin, Регистрировать сообщение вовсе не обязательно. Это нужно ТОЛЬКО тогда, когда сообщение посылается между окнами разных приложений. В таком случае регистрация сообщения гарантирует, что идентификатор сообщения будет один и тот же в этих приложениях. Конечно. Внешняя программа и будет это сообщение отсылать - я указывал вначале, что основная задача управлять проектом с помощью внешней программы. MasterZivDWORD и LRESULT не всегда одно и то же. Хм... А мне казалось - одно и тоже, по крайней мере на 32-х битах. Ну да ладно, это я тоже поправил. Сама передача сообщений работает на ура - я сделал маленький тестовый сервер MFC Dialog based, все отлично. Но возникла другая проблема, сегодня весь день голову ломал: При запуске этой лабуды в vba опять же крах. Стал разбираться. При отладке видно, что SetWindowLong с параметром -4 (GWL_WNDPROC) возвращает не адрес оконной процедуры а какуюто белиберду, при попытке обращения к которой естественно идет исключение. Поменял на +4 (DWL_DLGPROC), стал тестировать - что то странное. На тестовом сервере (который на обычном диалоге) отрабатывает так же как и с параметром -4. На диалоге vba опять грохается, но просмотр стека дает цепочку неидентифицируемых процедур. В связи с этим два вопроса: кто нибудь имеет опыт подмены диалоговой процедуры в vba? Объясните пожалуйста, как получилось, что при подмене адреса хоть GWL_WNDPROC, хоть DWL_DLGPROC для "нормального" диалогового окна все проходит правильно. Что, одна процедура вызывает другую что ли? PS: технология подмены позаимствована из статьи http://www.vbnet.ru/articles/showarticle.aspx?id=76 , там вроде GWL_WNDPROC используется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2014, 20:07 |
|
||
|
подмена оконной процедуры - крах приложения
|
|||
|---|---|---|---|
|
#18+
Провел исследования: под Spy++ проверил hWnd главного окна - все в порядке, совпадает с тем что дает Application.hWndAccessApp Беру GetClassName, GetWindowText - все правильно, все совпадает. Делаю ?hex(GetWindowLong(Application.hWndAccessApp,-4)) - возвращает FFFF0161, spy++ показывает 0x300bb46a Вот это и рушит все попытки сабклассинга. Почему возвращается ошибочное значение?6258 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2014, 11:27 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38653370&tid=2019433]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
65ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 170ms |

| 0 / 0 |
