Страница: 1 |
Страница: 1 |
Вопрос: В VB глюк, если я не ошибаюсь...
Добавлено: 03.04.05 22:11
Автор вопроса: DaSharm | Web-сайт:
нашел в ВБ 6.0 странный глюк в работе с Активикс контролами... Дело такое:
все мы знаем, что активиксы это по своей сути классы, в которых есть две самые главные функции создание и уничтожение (initialize & terminate). Вот если создать проэкт на ВБ, бросить на него Активикс контрол, тогда Вб вызвет initialize контрола...
Шаг1:initialize
(создаем класс в Design Time)
Это понятно....Запускаем прогу:
Шаг2:terminate
(удалили класс, созданный в Design Time)
Шаг3:initialize
(создаем класс в Run Time)
Далее закрываем прогу:
Шаг4:terminate
(удалили класс, созданный в Run Time)
Шаг5:initialize
(снова создаем класс в Design Time)
Хм.. работает хорошо, никаких нареканий...Но давайте небольшой эксперимент:
Откомпилим прогу!
Только мы заканчиваем компилить прогу, так сразу ВБ вызывает initialize...Да, именно, посмотрите что ВБ посмотрите что было в предыдущем шаге...К великому сожалению, тоже initialize.
Шаг6:initialize
Т. е. ВБ создает новый экземпляр без удаления старого...но это ровно пол беды. Давайте запустим прогу:
Шаг7:terminate
Шаг8:terminate ( в моей конфигурации так рухнет все...)
Вот за такое нужно бить по ушам, у меня проэкт на VC рухнет из-за этих чудес в исполнении ВБ. 2 раза подряд удалять экземпляр класса, это вообще беспредел...
Вопрос: что скажут гуру, кто неправ, я или ВБ?
Ответы
Всего ответов: 4
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #1
Добавлено: 04.04.05 10:31
На чем основаны твои высказывание о таком поведении ActiveX? Можно тестовый пример?
Номер ответа: 2
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #2
Добавлено: 04.04.05 16:51
Ок, на С++ сегодня дам тест. У меня баг вот в чем: в конструкторе класса активикса я создаю эщё один, экземпляр вообще левого класса, как член первого. А в деструкторе удаляю его... Вот если 2 раза подряд вызвать деструктор классса (что ВБ и делает) то мой левый класс будет 2 раза удален. но вот и не будет, будет 1 раз удален а при попытке второго прога уйдет в кому...
Номер ответа: 3
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #3
Добавлено: 04.04.05 20:40
Есть предположение, что событие, названное тобой Terminate представляет собой метод Release, который может вызываться столько раз, сколько был вызван AddRef, и если тебе на весь COM-объект нужен только один объект твоего класса, то надо удалять его только если число ссылок равно 0... Хотя если не нужно вызывать деструктор твоего объекта, я бы предпочел, чтобы память очищалась автоматически, вместе с удалением COM-объекта
Номер ответа: 4
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #4
Добавлено: 04.04.05 22:50
хи...если не удалить, то при попытке создания нового экземпляра прога в коме...