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:
IgorA 2010-06-08 21:43:19 +00:00
parent a9bc0ed088
commit 4c444c11c9
3 changed files with 57 additions and 21 deletions

View File

@ -202,7 +202,12 @@ er_message_found_lib, ihead_f_l, myimport, er_message_import, ihead_f_i
Макорос @use_library
Этот макрос представляет вызываемые процедуры, которые используются для работы групп макросов А и B. Данный макрос располагается в секции дата. Использование данного макроса обязательно.
Этот макрос представляет вызываемые процедуры, которые используются для работы групп макросов А и B. Данный макрос располагается в секции дата. Использование данного макроса нужно для загрузки библиотек но его можно заменять на @use_library_mem.
Макорос @use_library_mem mem_alloc,mem_free,mem_realloc,dll_load
Этот макрос использует макрос @use_library, но в отличие от него он позволяет для функций с именами 'lib_init' задавать 4 параметра. В даных параметрах могут быть указатели на функции для работы с памятью, которые могут быть нужны для использования внутри библиотеки.
Как я могу использовать макрос загрузки библиотеки/библиотек в своей программе?

View File

@ -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:
;---------------------------------------------------------------------
}

View File

@ -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]