Представляю вашему вниманию небольшую разработку - Add-in который позволяет в некоторой степени облегчить отладку некоторых программ, а также расширяет возможности компиляции. Все исходные коды прилагаются.
Данный Add-in имеет следующие возможности:
- Исправляет баг с Not Not Array после которого часто выскакивала ошибка "Expression too complex" если начать работать с вещественными числами;
- Позволяет использовать константы условной компиляции автоматически в зависимости от режима работы (IDE/EXE), как например в C++ (NDEBUG);
- Позволяет отключать проверку переполнения целочисленных операций в IDE;
- Позволяет отключать проверку операций с плавающей точкой в IDE;
- Позволяет отключать проверку границ массивов в IDE;
- Предоставляет события компиляции/линковки (для компиляции также в режиме работы в IDE/EXE), т.е. можно выполнять команды до и после этих событий. Используя эти события можно делать много чего полезного (шифрование, подмену OBJ файлов, статическую линковку и т.п)
Как это работает?
Для исправления бага Not Not, а также отключения проверок используется модуль замены обработчиков опкодов (P-code) на наши с отключенными проверками. Сначала ищется в таблица опкодов по сигнатуре в секции ENGINE модуля vba6.dll. Опкоды бывают одно и двух байтовые. Однобайтовые опкоды имеют номер меньший 0xFB, остальные двухбайтовые. Для поиска таблиц я использовал дизассемблер длин от Ms-Rem'а который я портировал на VB6. Также ищется процедура обработки перехода на следующий опкод, а также адрес процедуры генерации ошибки. Поскольку очень легко теперь стало уронить VB, я все-таки оставил некоторые проверки. К примеру обращение к неинициализированному массиву неизбежно вызовет креш - такие ситуации обрабатываются обработчиками. Поскольку не существует (по крайней мере я не нашел) никакой официальной документации по опкодам VB6, все исследования я делал сам, поэтому какие-либо опкоды могут вызвать ошибки. В этом случае пишите примеры сюда - я добавлю обработчики.
Для остальных фичей используется обычный сплайсинг функций:
- TipCompileProject;
- TipCompileProjectFull;
- TipMakeExe2;
- TipFinishExe2.
Проект очень слабо тестировался, поэтому могут быть многочисленные баги - пишите сюда.
Всем спасибо за внимание!