Форум программистов, компьютерный форум, киберфорум
The trick
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

Trick Advanced Tools.

Запись от The trick размещена 28.09.2016 в 11:03
Показов 7210 Комментарии 2

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

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


Нажмите на изображение для увеличения
Название: TAT_screen.png
Просмотров: 1081
Размер:	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 Кб, 444 просмотров)
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 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 вне форума
  2. Старый комментарий
    Dragokas, сорри не видел твой коммент. Отвечу позже, т.к. там сейчас обнаружен маленький, баг. Как исправлю дам все пояснения.
    Запись от The trick размещена 10.11.2016 в 18:35 The trick вне форума
 
Новые блоги и статьи
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru