forked from KolibriOS/kolibrios
new macros '@use_library_mem mem_alloc,mem_free,mem_realloc,dll_load'
in file 'load_lib.mac' git-svn-id: svn://kolibrios.org@1488 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
a9bc0ed088
commit
4c444c11c9
@ -200,9 +200,14 @@ er_message_found_lib, ihead_f_l, myimport, er_message_import, ihead_f_i
|
||||
jnz exit ;если не 0, то уходим.
|
||||
mov ebp, dword [ebp+ll_struc_size-8] - в ebp адрес начала.
|
||||
|
||||
Макорос @use_library
|
||||
Макорос @use_library
|
||||
|
||||
Этот макрос представляет вызываемые процедуры, которые используются для работы групп макросов А и B. Данный макрос располагается в секции дата. Использование данного макроса обязательно.
|
||||
Этот макрос представляет вызываемые процедуры, которые используются для работы групп макросов А и B. Данный макрос располагается в секции дата. Использование данного макроса нужно для загрузки библиотек но его можно заменять на @use_library_mem.
|
||||
|
||||
|
||||
Макорос @use_library_mem mem_alloc,mem_free,mem_realloc,dll_load
|
||||
|
||||
Этот макрос использует макрос @use_library, но в отличие от него он позволяет для функций с именами 'lib_init' задавать 4 параметра. В даных параметрах могут быть указатели на функции для работы с памятью, которые могут быть нужны для использования внутри библиотеки.
|
||||
|
||||
|
||||
Как я могу использовать макрос загрузки библиотеки/библиотек в своей программе?
|
||||
|
@ -117,7 +117,8 @@ local lp
|
||||
local lp1
|
||||
local correction
|
||||
local exit_
|
||||
;/equ
|
||||
|
||||
library_fun_memory_alloc equ 0 ;не использовать в макросах проверку на функции 'lib_init'
|
||||
err_message1 equ dword [esp+8]
|
||||
head1 equ dword [esp+4]
|
||||
|
||||
@ -325,6 +326,16 @@ align 4
|
||||
|
||||
|
||||
|
||||
macro @use_library_mem mem_alloc,mem_free,mem_realloc,dll_load
|
||||
{
|
||||
@use_library
|
||||
library_fun_memory_alloc equ mem_alloc
|
||||
library_fun_memory_free equ mem_free
|
||||
library_fun_memory_realloc equ mem_realloc
|
||||
library_fun_dll_load equ dll_load
|
||||
}
|
||||
|
||||
|
||||
macro sys_load_library library_name__, cur_dir_path__, library_path__, system_path__, err_message_found_lib__, head_f_l__, myimport, err_message_import__, head_f_i__,point_dir_name__
|
||||
{
|
||||
local end_steep
|
||||
@ -589,6 +600,9 @@ macro show_error_window err_message, head
|
||||
}
|
||||
|
||||
|
||||
;входные параметры:
|
||||
;eax - адрес библиотеки в памяти
|
||||
;myimport - импортируемые функции
|
||||
macro import_boxlib myimport, err_message_import__, head_f_i__
|
||||
{
|
||||
local import_loop
|
||||
@ -605,40 +619,60 @@ local import_not_found
|
||||
mov edx, eax
|
||||
mov esi,myimport
|
||||
import_loop:
|
||||
lodsd
|
||||
lodsd ;mov eax,dword[esi] ;add esi,4 ;получаем в eax указатель на имя импортируемой функции
|
||||
test eax, eax
|
||||
jz import_done
|
||||
push edx
|
||||
jz import_done ;если указатель на имя функции = 0 (в пользовательской программе)
|
||||
push edx ;сохраняем начало библиотечных указателей на функции
|
||||
import_find:
|
||||
mov ebx, [ds:edx]
|
||||
test ebx, ebx
|
||||
jz import_not_found
|
||||
push eax
|
||||
jz import_not_found ;если указатель на имя функции = 0 (в библиотеке)
|
||||
push eax ;eax - указатель на имя экспортируемой функции (в пользовательской программе)
|
||||
lp:
|
||||
mov cl, [ds:eax]
|
||||
cmp cl, [ds:ebx]
|
||||
jnz import_find_next
|
||||
cmp cl, [ds:ebx] ;сравниваем имена функций в библиотеке и в пользовательской программе
|
||||
jnz import_find_next ;если названия не совпали
|
||||
test cl, cl
|
||||
jz import_found
|
||||
jz import_found ;если названия совпали, и уже конец строки (cl=0)
|
||||
inc eax
|
||||
inc ebx
|
||||
jmp lp
|
||||
import_find_next:
|
||||
pop eax
|
||||
add edx, 8
|
||||
add edx, 8 ;8 = 4 байта указатель на название и 4 байта указатель на функцию
|
||||
jmp import_find
|
||||
import_found:
|
||||
pop eax
|
||||
mov eax, [ds:edx+4]
|
||||
mov [esi-4], eax
|
||||
pop edx
|
||||
pop ebx ;востанавливаем указатель на имя функции (который был в eax) и освобождаем стек
|
||||
mov eax, [ds:edx+4] ;eax = указатель на функцию (в библиотеке)
|
||||
mov [esi-4], eax ;копируем указатель (на функцию) в программу, -4 ставим потому что esi было сдвинуто командой lodsd
|
||||
pop edx ;устанавливаем edx на начало библиотечных функций
|
||||
;--- проверяем совпадает ли имя экспортированной функции с 'lib_init'
|
||||
if library_fun_memory_alloc eq 0
|
||||
else
|
||||
cmp dword[ebx],'lib_'
|
||||
jne import_loop
|
||||
cmp dword[ebx+4],'init'
|
||||
jne import_loop
|
||||
;--- если имя функции совпало с 'lib_init' попадаем сюда
|
||||
;подключение функций для работы с памятью
|
||||
;push eax
|
||||
;call dll.Init
|
||||
pushad
|
||||
mov esi,eax
|
||||
mov eax,library_fun_memory_alloc
|
||||
mov ebx,library_fun_memory_free
|
||||
mov ecx,library_fun_memory_realloc
|
||||
mov edx,library_fun_dll_load
|
||||
call dword esi
|
||||
popad
|
||||
end if
|
||||
jmp import_loop
|
||||
import_not_found:
|
||||
add esp,4
|
||||
show_error_window err_message_import__, head_f_i__ ;show error message /create window
|
||||
jmp e.exit
|
||||
import_done:
|
||||
xor eax,eax
|
||||
xor eax,eax ;=0 все загрузилось удачно
|
||||
e.exit:
|
||||
;---------------------------------------------------------------------
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ otst_panel_left equ 265
|
||||
include 'tile_fun.inc'
|
||||
include 'pl_import.inc'
|
||||
|
||||
@use_library
|
||||
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, dll.Load
|
||||
|
||||
struct FileInfoBlock
|
||||
Function dd ?
|
||||
@ -80,9 +80,6 @@ start:
|
||||
mcall -1 ;exit not correct
|
||||
@@:
|
||||
|
||||
stdcall dll.Init,dword[lib_init]
|
||||
stdcall dll.Init,dword[lib_init_ini]
|
||||
|
||||
copy_path ini_name,sys_path,file_name,0x0
|
||||
stdcall dword[ini_get_str],file_name,ini_sec,ini_k_cache,dword[edit1.text],dword[edit1.max],ini_def_cache
|
||||
stdcall [str_len],dword[edit1.text],dword[edit1.max]
|
||||
|
Loading…
Reference in New Issue
Block a user