Что-то я никак не пойму.
Сколько я помню, как только заходили разговоры про сабклассинг, автоматически начиналась речь про то, что ай-я-яй как страшно жить — если не снять сабклассинг перед нажатием на кнопку Stop в IDE, то всё рухнет.
Кажется лет 5 назад я пошёл разобраться, в чём же причина падений. Оказалось, что причина в том, что в VB есть баг: поскольку весь VB-шный код при отладке существует исключительно в P-кодной версии, всякое упоминание AddressOf заставляет VB сгенерировать native-кодный переходничок на P-код (и AddressOf возвращает именно адрес переходника), но эти переходники генерируются неправильно. В переходники заложена спасительная логика, которая наоборот должна помогать в таких делах как сабклассинг — при остановке проекта переходники не уничтожаются, а остаются в памяти, но начинают работать в обход P-кодных процедур. Но код «обходного манёвра» генерировался неправильно: сколько бы ни было аргументов у оборачиваемой функции, в переходничке всегда ставился retn 0, так что выполнение обходного манёвра портило стек, что и вызывало крах.
Я об этом неоднократно писал:
viewtopic.php?p=6771319#p6771319
viewtopic.php?p=6781455#p6781455
___________
Так вот!
Сейчас я пошёл посмотреть на тот код, и обнаружил, что:
1) Вопреки моим воспоминаниям о картине вещей, переходники генерируются правильно.
2) Если останавливать проект кнопкой «Stop» под IDE при установленном сабклассинге без его снятия — ничего не падает, как ни старайся.
Отсюда вопрос.
Это было актуально для какой-то старой версии VBA6.DLL, и какой-то сервиспак починил проблему? Или это я когда-то пропатчил свой VBA6.DLL, вылечил проблему и благополучно забыл про этому?
Пожалуйста, проверьте, есть ли у вас проблема падения среды и какая у вас версия VBA6.DLL. Можете сразу слать мне свои VBA6.DLL разных версий.