Форум программистов, компьютерный форум, киберфорум
Наши страницы
The trick
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Trick Advanced Tools.

Запись от The trick размещена 28.09.2016 в 11:03
Обновил(-а) The trick 29.09.2016 в 16:06

Всем привет!
Представляю вашему вниманию небольшую разработку - Add-in который позволяет в некоторой степени облегчить отладку некоторых программ, а также расширяет возможности компиляции. Все исходные коды прилагаются.
Данный Add-in имеет следующие возможности:
  • Исправляет баг с Not Not Array после которого часто выскакивала ошибка "Expression too complex" если начать работать с вещественными числами;
  • Позволяет использовать константы условной компиляции автоматически в зависимости от режима работы (IDE/EXE), как например в C++ (NDEBUG);
  • Позволяет отключать проверку переполнения целочисленных операций в IDE;
  • Позволяет отключать проверку операций с плавающей точкой в IDE;
  • Позволяет отключать проверку границ массивов в IDE;
  • Предоставляет события компиляции/линковки (для компиляции также в режиме работы в IDE/EXE), т.е. можно выполнять команды до и после этих событий. Используя эти события можно делать много чего полезного (шифрование, подмену OBJ файлов, статическую линковку и т.п)

Как это работает?


Нажмите на изображение для увеличения
Название: TAT_screen.png
Просмотров: 291
Размер:	27.4 Кб
ID:	3981

Для исправления бага Not Not, а также отключения проверок используется модуль замены обработчиков опкодов (P-code) на наши с отключенными проверками. Сначала ищется в таблица опкодов по сигнатуре в секции ENGINE модуля vba6.dll. Опкоды бывают одно и двух байтовые. Однобайтовые опкоды имеют номер меньший 0xFB, остальные двухбайтовые. Для поиска таблиц я использовал дизассемблер длин от Ms-Rem'а который я портировал на VB6. Также ищется процедура обработки перехода на следующий опкод, а также адрес процедуры генерации ошибки. Поскольку очень легко теперь стало уронить VB, я все-таки оставил некоторые проверки. К примеру обращение к неинициализированному массиву неизбежно вызовет креш - такие ситуации обрабатываются обработчиками. Поскольку не существует (по крайней мере я не нашел) никакой официальной документации по опкодам VB6, все исследования я делал сам, поэтому какие-либо опкоды могут вызвать ошибки. В этом случае пишите примеры сюда - я добавлю обработчики.
Для остальных фичей используется обычный сплайсинг функций:
  • TipCompileProject;
  • TipCompileProjectFull;
  • TipMakeExe2;
  • TipFinishExe2.
Для установки/получения констант условной компиляции есть функции TipSetConstantValues/TipGetConstantValues из VBA6.dll. В качестве событий используется обычный вызов ShellExecuteEx. Существуют события до начала компиляции проекта, после (в IDE); тоже самое для (EXE) + до начала и после линковки.
Проект очень слабо тестировался, поэтому могут быть многочисленные баги - пишите сюда.
Всем спасибо за внимание!
Вложения
Тип файла: zip TrickAdvancedTools.zip (72.5 Кб, 55 просмотров)
Размещено в Без категории
Просмотров 1014 Комментарии 2
Всего комментариев 2
Комментарии
  1. Старый комментарий
    Аватар для Dragokas
    Спасибо большое за проделанную работу и отдельно за исходники. Назовём это VB6 IDE service pack 7 ?

    Действительно некоторые ошибки попадались часто.
    Анатолий, я думаю, было бы очень здорово, если бы ты смог найти время, чтобы дополнить описание еще и примерами операций, которые приводят к ошибкам, чей обход ты производишь с помощью аддона.
    Отдельный +, если ты ещё и приведешь пример, как обойти ошибку средствами только IDE, но уже без этого аддона (для сравнения так сказать).

    Хотя бы, те же ситуации когда нужно:
    Visual Basic
    1
    
    1000 * 1000
    Можно заменить на
    Visual Basic
    1
    
    1000 * clng(1000)
    или на:
    Visual Basic
    1
    
    Private Declare Function Mul Lib "msvbvm60.dll" Alias "_allmul" (ByVal dw1 As Long, ByVal Reserved As Long, ByVal dw3 As Long, ByVal Reserved As Long) As Long
    Подмену obj также встречал, но там делалось через прокси-процесс.

    На счёт предустановленной константы условной компиляции (IDE/EXE), какие ты дал им названия?

    На счёт TipGetConstantValues, подразумевается, что в IDE уже есть какие-то свои константы, как например в VBA - #VBA7 ? Если да, неплохо бы сразу привести их список. Если нет, то не помешал бы также пример использования подобной техники, хотя бы декларации.
    Мне например, нужно собрать один и тот же проект в автоматическом режиме (консольной командой), но с разными опциями. 1 - #Debug = true, 2 - чтобы #Debug = false. Вот хотелось бы мини-пример.
    Сейчас в VB6 это сделано не совсем удобно, т.к. область видимости #переменной ограничивается модулем. Глобальная видимость, как я понимаю, сделано у тебя, будет намного более предпочтительной.

    И ещё, сразу столкнулся со сложностью, т.к. никогда не устанавливал чужие аддоны без установщика.
    Было бы неплохо написать, в какую папку копировать твой DLL, чтобы увидеть его в списках аддонов.

    Еще раз спасибо за работу и ответы.
    Запись от Dragokas размещена 30.09.2016 в 12:28 Dragokas вне форума
    Обновил(-а) Dragokas 30.09.2016 в 12:31
  2. Старый комментарий
    Dragokas, сорри не видел твой коммент. Отвечу позже, т.к. там сейчас обнаружен маленький, баг. Как исправлю дам все пояснения.
    Запись от The trick размещена 10.11.2016 в 18:35 The trick вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru