То, что называют Native DLL, то есть DLL-библиотеку, экспортирующую произвольные функции проекта.
Можно ли сделать такую DLL на VB6 без использования дополнительных плагинов, Add-in'ов, утилит, внешних хаков, без подмены линкера, компилятора. Используя исключительно голый VB6 в своём изначальном виде (даже без сервиспаков)?
Все сказали бы «нет», но на самом деле — можно .
- Собственно, я начал зарываться внутрь и изучать внутренне устройство VB ещё в 2007 году во времена работы над FNDLL. Потом во время работы над указателями на функции, созданием экземпляров классов по имени, и некоторыми другими неопубликованными кирпичами. В последнее время я плотно занялся реверс-инжинирингом засев за кирпич, который даст вам совершенно стабильную многопоточность. Причём за последние две недели я продвинулся гораздо дальше, чем за предшествующие 3 года. Прогресс идёт по экспоненте.
Итак. VBP-файл (файл проекта) по своей сути является ini-файлом. Это никакой не секрет, не тайна, а вполне себе документированный факт. Вы можете делать в нём [секции] и пары ключ=значение как в любом нормальном ini-файле. (Это настолько документировано, что Add-in'ам дали возможность вызывать методы ReadProperty/WriteProperty у класса VBProject, чтобы Add-in'ы могли хранить свои произвольные данные, привязанные к проектам.)
А теперь сюрприз: VB поддерживает секцию VBCompiler в которой может быть два ключа:
- C2Switches — который определяет дополнительные ключи вызова компилятора (c2.exe)
- LinkSwitches — который опредеяет дополнительные ключи вызова линкера (link.exe)
Ключи вызова линкера тоже не являются тайной, они все документированы, и в частности, документирован ключ /EXPORT:, который позволяет определить произвольное число экспортируемых модулем сущностей.
Так вот, если у вас в модулях есть функции Foo и Bar и вы хотите их экспортировать в своей DLL, единственное, что вам нужно сделать, это открыть vbp-файл блокнотом и добавить туда вот это:
- Код: Выделить всё
[VBCompiler]
LinkSwitches=-export:Foo -export:Bar
Вуаля:
В топку всякие примочки, подменяющие link.exe или делающие подобные грязные трюки. VB изначально позволяет вам обойтись без этого. Правда и никакой «инициализации рантайма» нет, но ни одна из «грязных примочек» её и так не предлагала, только мой FNDLL имел в этом плане отличие.
Можете скачать этот проект и скомпилировать его в девственно чистом VB6 и убедиться, что экспорты создаются:
P.S. Никаких других ключей, кроме этих двух (С2Switches и LinkSwitches), гарантированно не поддерживается. В смысле, поддерживаются любые ключи, но особоые значения имеют эти два. Судя по всему, я первый, кто пишет об этих фичах.
P.P.S. И конечно, использование этих двух ключей совсем не ограничивается экспортом произвольных имён.