@Linda-chan

Тег vb6 в блоге Linda-chan

Linda-chan

Поверить не могу, что ещё двадцать лет назад не отключила автоматическую проверку синтаксиса в VB6 IDE! Это опция, которая отвечает за выскакивающие сообщения в случае, если курсор покидает строку, а в ней – какая-то ошибка, например, скобка не закрыта. Сообщение выдаётся обычным MessageBox(), и его нужно закрывать. А тут никаких сообщений, но! Строки с ошибками всё равно подсвечиваются красным! И все сообщения выдаются только при попытке запуска программы! Просто фантастика! OO

Linda-chan

Кстати о. Есть ещё один способ получить даже более вдохновляющие результаты. Однажды мне потребовалось написать функцию, которая берёт байтовый буфер и форматирует его как в Hex просмотрщиках. Через строку всё делается очень просто, но очень долго. Всякие оптимизации не давали прямо радикального ускорения. Поэтому я написала функцию, которая сначала вычисляет размер байтового буфера, в котором будет содержаться ANSI строка, а потом по байтикам собирает эту самую строку. Быстродействие в результате такое, что даже реально большие массивы (по паре сотен метров) форматируются за считанные секунды. Главный минус – читается это не очень хорошо, нужно напрягать мозг после перерыва, чтобы понять, что происходит. Я хотела сделать такое же, но для генерации UUE, но до сих пор духа не хватает, хотя вариант со строками написала быстро и даже оптимизировала в итоге.

Linda-chan

В последнее время я начала присматриваться к быстродействию своих программ в части операций с коллекциями и строками. Одну библиотеку радикально оптимизировала, например, применив новый для себя метод перечисления сразу двух коллекций одновременно (функциями из MSVBVM60.DLL, которые на самом деле стоят за For-Each, но избавляют от прямого взаимодействия с IEnumVARIANT). А началось с того, что меня до ужаса достала программа, парсящая логи ownCloud. Она сначала читает из файла идентификаторы обработанных сообщений в логах, потом парсит необработанные сообщения в файле лога, делая из JSON'ов в JSON'ах читаемые сообщения, сохраняет их в файлы сообщений и снова записывает файл с обновлёнными идентификаторами. И пока всё это продолжается, скрытое окно программы не обрабатывает сообщения, и всякие проводники, рассылающие широковещательные сообщения, вешаются при попытке открыться. Ранее я уже в программе снижала приоритет, чтобы не так грузило процессор. В этот раз я решила напихать DoEvents между обработкой JSON'ов, кою считала основной проблемой. Но оказалось, что загрузка списка занимала меньше секунды, парсинг – меньше секунды, сохранение списка – две-три минуты. Да, там была коллекция, которая долго перечислялась через индекс, а текст наращивался простым «TXT = TXT & Item». Поэтому я сделала так чтобы перечисление шло через «For Each», а текст собирала через Mid() в заранее выделенную строку, длину которой вычисляла отдельным перечислением. В результате программа вместо нескольких минут работает в районе секунды. Можно сказать, вдохновляющий результат!

Linda-chan

The following table contains possible examples of msvbvm60.dll being misused. While msvbvm60.dll is not inherently malicious, its legitimate functionality can be abused for malicious purposes.

https://strontic.github.io/...FD729C662C8DB1E.html
Как? Написанием вредоносной программы на VB, которая по дизайну будет использовать эти функции?

Linda-chan

Reverse engineering VB binaries will often involve reverse engineering VB internals for various VB APIs, a task dreaded by many. The entry point of a VB program diverts from the typical C/C++ or even Borland Delphi binary. There is no mainCRTStartup or WinMainCRTStartup function that initializes the C runtime and calls the developer defined main or WinMain function.

https://blog.talosintellige...cally-loaded-api-in/ https://blog.talosintelligence.com/discovering-dynamically-loaded-api-in/#%3a~%3atext=Reverse%20engineering%20VB,or%20WinMain%20function.
Очевидное невероятное: программы, написанные на VB используют рантайм VB, а не рантайм C/C++, и не вызывают функции из рантайма C/C++!

Linda-chan

Не, я знаю, что For Each, не смотря на использование варианта, работает быстрее, чем просто For с индексом, но чтобы настолько... Коллекция, 240 тысяч элементов типа Long, с которым в цикле производятся действия (коллекция перегоняется в массив). For с индексом пережёвывает коллекцию за тридцать-сорок секунд. For Each проносится по коллекции за 0.12 секунд.

Linda-chan

Я тут пишу кое-что, и снова столкнулась с такими мерзкими, но неизбежными вещами, как байтовые буферы, в том числе запихнутые в строки. Всвязи с чем два наблюдения.
1. У VB нет встроенных механизмов, чтобы скопировать часть одного байтового буфера в другой. CopyMemory().
2. Строки в VB – юникодные, но могут быть ANSI, если хорошо попросить. Понять, в каком формате строка, очень трудно, но сам VB знает, что там внутри.

Linda-chan

Оказалось, что неразрывный пробел считается валидным символом в именах в VB6. Тоесть можно делать переменные, функции, константы с именами вида «Do It Already()».

Linda-chan

Пилю модуль со строковыми функциями в стиле VB6. В качестве упражнения и безболезненного погружения. Сначала хотела стандартный класс переопределить, но потом решила не делать этого. Собственно, узнала кое-что новое про сами VB функции. Например, в Replace() есть параметр Start, который по идее только сообщает с какого символа начинать поиск и замену, а на деле (и это задокументировано!) срезает всё, что было до этого символа. Я прямо в шоке, всегда думала, что активно использую этот параметр, ан нет, видать, ни разу не использовала.

⬆

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.