Привет!
Реализовал альфа версию автозагрузки библиотек и связывания импортов.
Ограничения:
1) нет выдачи сообщений об ошибках в случае если библиотека или функция в библиотеки не найдена
2) нет автозагрузки зависимых библиотек (требуется доработка формата библиотек)
Кратко, как использовать это в своем приложении:
1. В заголовке приложения в поле version (следует после MENUET01) необходимо указать цифру 2
2. Следом после заголовка добавить указатель на импортируемые библиотеки
3. Указать импортируемые библиотеки (так же, как и при использовании dll.Load)
4. Добавить код, без подключения dll.inc и соответственно без вызова dll.Load. Функцию инициализации кучи (ф. 68.11) тоже вызывать не нужно.
5. Скомпилировать программу и запустить.
Если все сделано правильно, то при запуске на доске отладки будет сообщение "App header version 2". В случае отсутствия библиотеки DLL.OBJ будет показано сообщение, в т.ч. через @NOTIFY. Если получаете ошибку станицы убедитесь, что выполнены п. 2 и 3
Code:
format binary as ""
use32
org 0x0
db 'MENUET01' ; Signature
dd 2 ; Header version - for automatically load dll.obj must be 2
dd START ; Ptr to entry point
dd I_END ; Image size
dd MEM ; required memory
dd STACKTOP ; stack pointer
dd 0 ; command line
dd 0 ; icon pointer
dd @IMPORT ; pointer to import table
include '../../proc32.inc'
include '../../macros.inc'
START:
; You code here
invoke foo_bar1
invoke foo_bar2, [foo_bar], eax
; ...
; Exit programm
mcall -1
align 4
; Import table
@IMPORT:
library foo_lib, 'foo.obj'
import foo_lib, \
foo_bar1, 'foo_bar1', \
foo_bar2, 'foo2'
foo_bar dd ?
I_END:
rb 4096 ; size of stack
align 16 ; ?
STACKTOP:
align 4
MEM:
;IM_END: