На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> Сабклассинг без падений
    Мдя
    Причина то и у тебя и у меня очевидна - ret из "стабовой" процедуры кидает в выгруженный код отлаживаемой программы. Что тут делать, нужно думать

    Добавлено
    Вообще есть очень простое решение - проверять в процедуре wndproc адрес возврата, если он указывает на неправильный код, запускать message pumping
    Со временем это конечно немного нарастит потребляемую IDE память, но по крайней мере работать будет
      ANDLL
      А можно чуть подробнее? Я так понимаю, что адрес возврата можно как-то получить по адресу то ли первого, то ли последнего аргумента? (или нет?)

      Собственно, чтобы определить, что вызван энд, может быть даже достаточно того, что EbMode вернула 0?

      А message pumping - это что? и как его запустить?
        Цитата Артур @

        Собственно, чтобы определить, что вызван энд, может быть даже достаточно того, что EbMode вернула 0?
        Поэкспирементируй, должно быть достаточно
        Цитата Артур @
        Я так понимаю, что адрес возврата можно как-то получить по адресу то ли первого, то ли последнего аргумента? (или нет?)
        Да, но идея все равно ошибочная, забей
        Цитата Артур @

        А message pumping - это что? и как его запустить?

        Вобщем вероятно в конце твоего wndproc должен быть код в стиле
        if ebmode=0 then'(или какое там число свидетельствует о нажатии reset\end)
        do while getmessage(...)
        translatemessage(...)
        dispatchmessage(...)
        loop
        exitthread(0)'Все равно корректно стек уже не раскрутится
        endif
          Цитата ANDLL @
          'Все равно корректно стек уже не раскрутится


          То есть, если энд, то просто гоняем цикл, пока бейсик не закроют естественным путём? как-то так, что ли? Или я не понял?

          Я что-то такое и предполагал - в class_terminate вызывал меседжебокс и пока этот бокс висел, среда жила. Я заменил msgBox на MessageBox. Пока бокс висит, среда живет... И ИДЕ доступна... но запуск так и не остановился :( Как бокс закрываю, бейсик дохнет.

          Что-то мне подсказывает, что с циклом получится то же самое - по-моему, нужно-таки как-то выйти из class_terminate, иначе останов так и недоостановится. Может, чтобы класс дотерминился, запустить этот цикл по таймеру? или не поможет?

          Добавлено
          В общем, попробова. При таком подходе проблема - недоостанов проекта. То есть, закрыть отладчик я теперь могу, а доостановить - нет :( Это и понятно - ИДЕ недоостановится, пока недоостановится подключенная к проекту библиотека, а библиотека не выгружается дожидаясь ИДЕ.

          Наверное, в твоем варианте - без библиотеки, внутри неуправляемой заглушки - этот подход сработает, ведь у бейсика не будет необходимости дожидаться выгрузки библиотеки, а заглушка останется в его собственном контексте.
          Сообщение отредактировано: Артур -
            Не, тут дело в другом, но раз не работает, то увы. Других идей вроде нет
              Есть подозрение, что даже если ты среду закрываешь, то процесс висеть останется, поскольку msg-loop будет крутиться.
                Нет, почему?
                  Цитата ANDLL @
                  но раз не работает, то увы
                  Нет, почему же - в общем-то, работает, просто не совсем так, как бы хотелось :)
                  Цитата ANDLL @
                  Других идей вроде нет

                  Жаль :unsure:

                  Пока сделал так: Если нажать энд, будет выскакивать сообщение, что, мол, при субклассинге энд - не хорошо, и больше, мол, так не делайте. Бейсик закроется (предложив сохраниться, если нужно) и выдаст сообщение, мол, а не хотите ли перезагрузить проект.
                  ExpandedWrap disabled
                    'это в 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
                    Цитата ANDLL @
                    Нет, почему?

                    Делал как-то программку, которая UEH на свой меняла, вскидывала окошко с предложением продолжить выполнение на свой страх и риск, после чего закручивала цикл msg. Многие приложения продолжали корректно работать, но вот после закрытия окна, процесс оставался, ибо луп крутился. (В подробности затем не вдавался, поскольку забил на это дело).
                      Странно что он крутился-то... Обычно программы желая выйти вызывают postquitmessage и тогда цикл завершается. Наверное там чтото другое висло?
                        Нашел пример, который не рушится ни при каких эндах :)

                        В нем, как обычно, асм...
                        Из примера выбросил всё, что только смог - чтобы остался только непадающий субклассинг. Но оригинал тоже прилагаю :)

                        Гляньте, кто в Асме понимает: в чем там фишка?
                        Сообщение отредактировано: Артур -

                        Прикреплённый файлПрикреплённый файлSubclass.zip (145.25 Кбайт, скачиваний: 1056)
                          Дык в комментах написано
                          Цитата
                          IDE has stopped, unsubclass the window
                            да, но я в своем варианте тоже снимаю субклассинг - а оно всё равно падает :)

                            добавлено:

                            блинн... в прошлом топике положил неполный архив - без того класса, который "упростил". Перезалил :)
                            Сообщение отредактировано: Артур -
                              Господа, а каже быть с офисом 2010. Ведь там нет vba6.dll в котрой сидит ebMode. VBA там 7-й версии да и vba7.dll тоже нет, нашел только vbe7.dll но ebMode там нет, подскажите как быть, как заставить рабоать все это на 2010 офисе?
                                ну что нет никаких вариантов?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0575 ]   [ 16 queries used ]   [ Generated: 27.04.24, 12:51 GMT ]