|
Линковка статических библиотек OBJ/LIB к VB-экзешнику
|
|||
---|---|---|---|
#18+
Интересует как использовать статическую линковку в VB. 1. Вариант. Написание кода статических библиотек самостоятельно на C++, компиляция и линковка с VB-exe. 2. Вариант. Конвертация уже существующих DLL в статическую библиотеку и линковка с VB-exe. Желательно с примерами проектов и архивчиком *.lib для Link.exe ) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2019, 16:01 |
|
Линковка статических библиотек OBJ/LIB к VB-экзешнику
|
|||
---|---|---|---|
#18+
Eolt, Слинковать объектный файл с объектными файлами сделанными в VB6 не проблема. Существует как минимум 2 пути. Первый легкий, но он добавляет нежелательный экспорт к исполняемому файлу. Для этого просто нужно в опциях линкера (LinkSwitches) указать параметр EXPORT с нужными функциями и соответственно указать библиотеку для компоновки. Библиотеки написанные на C/C++ требуют инициализацию рантайма поэтому в качестве точки входа (параметр ENTRY) следует указать mainCRTStartup (_DllMainCRTStartup для DLL). Данная функция инициализирует рантайм и передает управление функции main (wmain). Т.к. точка входа в вб программу называется __vbaS то необходимо как то передать туда управление вместо main. Простейший способ - это написание тривиального редиректора на FASM: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Здесь просто происходит прыжок на точку входа VB6 EXE файла. При соблюдении этих условий будет выполнена инициализация сначала рантайма C/C++ затем инициализация рантайма VB. К примеру, имеем статическую библиотеку со следующим кодом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Нам нужно прилинковать статически этот код к EXE файлу сделанному в VB6. Нужно создать 2 версии библиотеки DLL и OBJ/LIB, соответственно для отладки в IDE и для скомпилированного варианта. В VB код будет таким: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
В этом случае будет происходить вызов функции из DLL при значении константы условной компиляции INIDE = True и вызов функции из себя же при False . Пример использования: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
Для того чтобы обеспечить линковку просто указываем параметры линкеру: Код: sql 1. 2.
Данные опции задают консольную подсистему, задают точку входа и экспортируемые функции. Здесь есть одна проблема с родным линкером - в нем есть баг при использовании опции OPT:REF - он отбрасывает импорт от основного EXEшника, поэтому если используется родной линкер то необходимо указать OPT:NOREF также. При использовании нового линкера данные действия необязательны. После компиляции получаем нужный результат: ____________________________________________________________________________________________ Другой способ более сложен, но избавляет от нежелательного экспорта. Данный способ использует замену модуля во время линковки. Для этого необходимо писать специальный Add-in либо использовать мой TrickAdvancedTools (с открытыми исходниками, но нем есть баги которые я не могу/хочу в данный момент исправлять) в качестве вспомогательного средства. В этом случае вместо импорта функций из себя же, придется создать отдельный стандартный модуль с функциями-пустышками с необходимыми прототипами. В свойствах Add-in'а необходимо выбрать события компиляции (before linking) и прописать там BATCH файл который будет заменять модуль пустышку на модуль переходник. Модуль переходник такой же тривиальный, следует только учесть что символы будут вида ?FuncName@ModuleName@@AAGXXZ (декорированные) и выполняет функции прыжка на необходимые linked символы. К примеру все тоже самое как и в первом примере, только без экспорта. Модуль изменится на: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
Здесь просто вызываются функции пустышки при INIDE = False (компиляции). Также создается простой редиректор: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
modStaticLib здесь - имя заменяемого модуля. Следующий шаг - замена оригинального modStaticLib.OBJ на редиректор перед линковкой: Код: sql 1. 2.
И установить событие перед линковкой: Последний шаг - удалить экспорты которые были добавлены в предыдущем способе: Код: sql 1. 2.
Все, можно компилировать и получить монолитный файл: Все файлы прикладываю. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2019, 16:52 |
|
|
start [/forum/topic.php?fid=60&msg=39765073&tid=2154952]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
8ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 20ms |
total: | 165ms |
0 / 0 |