Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.15.112.69] |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Мдя
Причина то и у тебя и у меня очевидна - ret из "стабовой" процедуры кидает в выгруженный код отлаживаемой программы. Что тут делать, нужно думать Добавлено Вообще есть очень простое решение - проверять в процедуре wndproc адрес возврата, если он указывает на неправильный код, запускать message pumping Со временем это конечно немного нарастит потребляемую IDE память, но по крайней мере работать будет |
Сообщ.
#17
,
|
|
|
ANDLL
А можно чуть подробнее? Я так понимаю, что адрес возврата можно как-то получить по адресу то ли первого, то ли последнего аргумента? (или нет?) Собственно, чтобы определить, что вызван энд, может быть даже достаточно того, что EbMode вернула 0? А message pumping - это что? и как его запустить? |
Сообщ.
#18
,
|
|
|
Цитата Артур @ Поэкспирементируй, должно быть достаточноСобственно, чтобы определить, что вызван энд, может быть даже достаточно того, что EbMode вернула 0? Цитата Артур @ Да, но идея все равно ошибочная, забейЯ так понимаю, что адрес возврата можно как-то получить по адресу то ли первого, то ли последнего аргумента? (или нет?) Цитата Артур @ А message pumping - это что? и как его запустить? Вобщем вероятно в конце твоего wndproc должен быть код в стиле if ebmode=0 then'(или какое там число свидетельствует о нажатии reset\end) do while getmessage(...) translatemessage(...) dispatchmessage(...) loop exitthread(0)'Все равно корректно стек уже не раскрутится endif |
Сообщ.
#19
,
|
|
|
Цитата ANDLL @ 'Все равно корректно стек уже не раскрутится То есть, если энд, то просто гоняем цикл, пока бейсик не закроют естественным путём? как-то так, что ли? Или я не понял? Я что-то такое и предполагал - в class_terminate вызывал меседжебокс и пока этот бокс висел, среда жила. Я заменил msgBox на MessageBox. Пока бокс висит, среда живет... И ИДЕ доступна... но запуск так и не остановился Как бокс закрываю, бейсик дохнет. Что-то мне подсказывает, что с циклом получится то же самое - по-моему, нужно-таки как-то выйти из class_terminate, иначе останов так и недоостановится. Может, чтобы класс дотерминился, запустить этот цикл по таймеру? или не поможет? Добавлено В общем, попробова. При таком подходе проблема - недоостанов проекта. То есть, закрыть отладчик я теперь могу, а доостановить - нет Это и понятно - ИДЕ недоостановится, пока недоостановится подключенная к проекту библиотека, а библиотека не выгружается дожидаясь ИДЕ. Наверное, в твоем варианте - без библиотеки, внутри неуправляемой заглушки - этот подход сработает, ведь у бейсика не будет необходимости дожидаться выгрузки библиотеки, а заглушка останется в его собственном контексте. |
Сообщ.
#20
,
|
|
|
Не, тут дело в другом, но раз не работает, то увы. Других идей вроде нет
|
Сообщ.
#21
,
|
|
|
Есть подозрение, что даже если ты среду закрываешь, то процесс висеть останется, поскольку msg-loop будет крутиться.
|
Сообщ.
#22
,
|
|
|
Нет, почему?
|
Сообщ.
#23
,
|
|
|
Цитата ANDLL @ Нет, почему же - в общем-то, работает, просто не совсем так, как бы хотелось но раз не работает, то увы Цитата ANDLL @ Других идей вроде нет Жаль Пока сделал так: Если нажать энд, будет выскакивать сообщение, что, мол, при субклассинге энд - не хорошо, и больше, мол, так не делайте. Бейсик закроется (предложив сохраниться, если нужно) и выдаст сообщение, мол, а не хотите ли перезагрузить проект. 'это в Class_Terminate If killEnd Then 'если нас убивали эндом и субклассинг уже снят MsgBox "Ай-яй-яй, не нужно использовать End при субклассинге! Библиотека в этом случае не может предотвратить выгрузку бейсика. Но вы сможете сохранить изменения, если они были." Dim s As String s = GetMyCommandLine SendMessage hwBs, WM_CLOSE, 0, ByVal 0 'Если это закомментировать, 'бейсик не вылетает, но и остонов до конца не останавливается :( Dim ms As MSG Do While GetMessage(ms, 0, 0, 0) TranslateMessage ms DispatchMessage ms Loop If MsgBox("Хотите перезапустить этот же проект?", vbYesNo) = vbYes Then Shell s, vbNormalFocus End If ExitThread 0 End If |
Сообщ.
#24
,
|
|
|
Цитата ANDLL @ Нет, почему? Делал как-то программку, которая UEH на свой меняла, вскидывала окошко с предложением продолжить выполнение на свой страх и риск, после чего закручивала цикл msg. Многие приложения продолжали корректно работать, но вот после закрытия окна, процесс оставался, ибо луп крутился. (В подробности затем не вдавался, поскольку забил на это дело). |
Сообщ.
#25
,
|
|
|
Странно что он крутился-то... Обычно программы желая выйти вызывают postquitmessage и тогда цикл завершается. Наверное там чтото другое висло?
|
Сообщ.
#26
,
|
|
|
Нашел пример, который не рушится ни при каких эндах
В нем, как обычно, асм... Из примера выбросил всё, что только смог - чтобы остался только непадающий субклассинг. Но оригинал тоже прилагаю Гляньте, кто в Асме понимает: в чем там фишка? Прикреплённый файлSubclass.zip (145.25 Кбайт, скачиваний: 1056) |
Сообщ.
#27
,
|
|
|
Дык в комментах написано
Цитата IDE has stopped, unsubclass the window |
Сообщ.
#28
,
|
|
|
да, но я в своем варианте тоже снимаю субклассинг - а оно всё равно падает
добавлено: блинн... в прошлом топике положил неполный архив - без того класса, который "упростил". Перезалил |
Сообщ.
#29
,
|
|
|
Господа, а каже быть с офисом 2010. Ведь там нет vba6.dll в котрой сидит ebMode. VBA там 7-й версии да и vba7.dll тоже нет, нашел только vbe7.dll но ebMode там нет, подскажите как быть, как заставить рабоать все это на 2010 офисе?
|
Сообщ.
#30
,
|
|
|
ну что нет никаких вариантов?
|