Subversion Repositories Kolibri OS

Rev

Rev 1373 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1127 Lrz 1
Руководство программиста по использованию макросов для универсальной загрузки библиотеки/библиотек
2
от 6 июля 2009г.
3
 
4
Copyright (c) 2009, 
5
All rights reserved.
6
 
7
        Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
8
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
9
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
10
Neither the name of the  nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
11
 
12
        THIS SOFTWARE IS PROVIDED BY Alexey Teplov aka  ''AS IS'' AND ANY
13
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE MPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  DISCLAIMED. IN NO EVENT SHALL  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
14
        LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
15
*****************************************************************************Изменения:
16
 
17
Доработан макрос, убраны ограничения при его использовании. Вывод сообщений об ошибках производиться в отдельном потоке. При пакетной обработке загрузки библиотек, в начале формируется все сообщения от библиотек, которые загружены с ошибками, и затем произведен вывод на экран отдельным потоком со всем списком ошибок.Введение:
18
 
19
        В последнее время наметилась тенденция в переносе основных, базовых блоков (компонентов) в библиотеки. Для разработчика это является очень удобно, т.к. сроки разработки программы значительно сокращаются. Макрос load_lib.mac разрабатывался как универсальный для загрузки любого количества библиотек. Особенностью его является то, что если библиотека не может быть найдена по указанному пути, или существует ошибка при импорте, то тогда, формируется сообщение и выводиться в окне информация об ошибке. Поиск библиотеки происходит по 2-м направлениям. В текущей папке, откуда стартовала программа и в системной папке (по указанному пути + название библиотеки).
20
Структура макросов:
21
 
22
        Файл load_lib.mac состоит из 5 основных макросов.
23
Для загрузки одной библиотеки существуют макросы первой группы, назовем, ее группа А.  Для загрузки от 2-х и более библиотек созданы макросы группы B. Название этих макросов:
24
 
25
A:
26
sys_load_library
27
load_library
28
B:
29
sys_load_libraries
30
load_libraries
31
 
32
        Для макросов группы А необходимо в качестве параметров указать следующие опции:
33
library_name, cur_dir_path, library_path, system_path, err_message_found_lib, head_f_l, myimport, err_message_import, head_f_i . Синтаксически правильно использовать следующию запись для правильного разворачивания макроса:
34
 
35
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
36
 
37
или
38
 
39
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
40
 
41
        Разница между этими двумя макросами только в порядке проверки пути к библиотеке.
42
sys_load_library - в первую очередь проверяется значение указанное в system_path, т.е. на этом месте где находится system_path должен быть помещен адрес записи.
43
 
44
Всегда соблюдать последовательность в имени.
45
system_path      db '/sys/lib/'
46
library_name     db 'box_lib.obj',0     ; такая запись сделана из экономии места
47
 
48
Если есть желание разъединить, то нужно использовать следующую конструкцию
49
system_path      db '/sys/lib/box_lib.obj',0
50
... любая последовательность других команд и определений.
51
library_name     db 'box_lib.obj',0
52
 
53
 
54
А load_library - в первую очередь проверяет текущую папку, т.е. использует этот путь для поиска библиотеки.
55
 
56
library_name - имя библиотеки обычно в данных определяется как
57
library_name     db 'box_lib.obj',0
58
 
59
Иногда, возникает необходимость загрузки библиотеки с папки, которая находиться ниже уровнем директории, с которой была запущена программа. Допустим, следующее:
60
 
61
 
62
Необходимая нам библиотека расположена в папке ff2, для того, что бы макрос загрузил библиотеку из этой папки, нам нужно сделать следующее:
63
 
64
Обращаю внимание, что короткая запись в этом случае невозможна, и нужно определить следующие пути полностью.
65
system_path      db '/sys/lib/tread_lib.obj',0
66
;... любая последовательность других команд и определений.
67
library_name     db 'ff2/tread_lib.obj',0
68
- именно такое определение имени, позволит динамически сформировать путь до нашей бибилотеки.
69
 
70
cur_dir_path - первоначально должен быть определен в заголовке программы, как:
71
 
72
use32                   ; транслятор, использующий 32 разрядных команды
73
    org 0x0             ; базовый адрес кода, всегда 0x0
74
    db 'MENUET01'       ; идентификатор исполняемого файла (8 байт)
75
    dd 0x1              ; версия формата заголовка исполняемого файла
76
    dd start            ; адрес, на который система передаёт управление
77
                        ; после загрузки приложения в память
78
    dd i_end            ; размер приложения
79
    dd mem              ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта
80
    dd mem              ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше
81
    dd 0x0              ; указатель на строку с параметрами.
82
    dd cur_dir_path     ; указатель на адрес, куда помещается строка, содержащая путь до программы в момент запуска.
83
а затем в секции DATA программы
84
 
85
cur_dir_path    rb 4096 ; значение 4096 может быть и меньше, но должно вмещать полностью путь до библиотеки. Т.е. это буфер, в котором формируется путь при запуске программы.
86
 
87
library_path - начало буфера, в котором будет сформирован путь полученный при запуске программы с именем библиотеки.
88
library_path    rb 4096
89
 
90
system_path - путь до библиотеки с именем библиотеки. Предполагаем, что, тут указан полный путь до библиотеки.
91
Всегда соблюдать последовательность в имени.
92
system_path      db '/sys/lib/'
93
library_name     db 'box_lib.obj',0     ; такая запись сделана из экономии места
94
 
95
Если есть желание разъединить, то нужно использовать следующую конструкцию
96
system_path      db '/sys/lib/box_lib.obj',0
97
... любая последовательность других команд и определений.
98
library_name     db 'box_lib.obj',0
99
 
100
err_message_found_lib - строка, которая будет в сформированном окне, если библиотека не будет найдена.
101
 
102
err_message_found_lib   db 'Sorry I cannot load library box_lib.obj',0
103
 
104
head_f_l -  заголовок окна, при возникновении ошибки - библиотека не найдена.
105
head_f_l        db 'System error',0
106
 
107
myimport -  указатель на импорт функций из библиотеки.
108
myimport:
109
 
110
edit_box_draw   dd      aEdit_box_draw
111
edit_box_key    dd      aEdit_box_key
112
edit_box_mouse  dd      aEdit_box_mouse
113
version_ed      dd      aVersion_ed
114
 
115
check_box_draw  dd      aCheck_box_draw
116
check_box_mouse dd      aCheck_box_mouse
117
version_ch      dd      aVersion_ch
118
 
119
option_box_draw  dd      aOption_box_draw
120
option_box_mouse dd      aOption_box_mouse
121
version_op       dd      aVersion_op
122
 
123
                dd      0
124
                dd      0
125
 
126
aEdit_box_draw  db 'edit_box',0
127
aEdit_box_key   db 'edit_box_key',0
128
aEdit_box_mouse db 'edit_box_mouse',0
129
aVersion_ed     db 'version_ed',0
130
 
131
aCheck_box_draw  db 'check_box_draw',0
132
aCheck_box_mouse db 'check_box_mouse',0
133
aVersion_ch      db 'version_ch',0
134
 
135
aOption_box_draw  db 'option_box_draw',0
136
aOption_box_mouse db 'option_box_mouse',0
137
aVersion_op       db 'version_op',0
138
 
139
err_message_import - строка, которая будет в сформированном окне, если при импорте функций произошла ошибка.
140
 
141
err_message_import      db 'Error on load import library box_lib.obj',0
142
 
143
head_f_i - заголовок окна, при возникновении ошибки - ошибка импорта функций.
144
head_f_i        db 'System error',0
145
 
146
        После того, как макрос будет раскрыт и отработает свою часть кода, можно узнать об успешности или не успешности загрузки, импорте библиотеки. В регистре еax формируется 0 при успешной загрузке и импорте, или -1, если на любом из этих этапов возникла ошибка. При возникновении ошибки рекомендуется завершить выполнение программы.
147
        cmp     eax,-1
148
        jz      exit
149
 
150
Группа макросов B
151
 
152
        Основным отличием макросов группы А, от группы B является блочная (пакетная) обработка загрузки большого количестве библиотек. Так же, больше информации можно получить после обработки пакета. Так, при пакетной обработке получаем код возврата, который содержит 2 типа кодов ошибок:
153
Не нашли либу
154
Не смогли импортировать функции.
155
 
156
B:
157
sys_load_libraries
158
load_libraries
159
 
160
        Для макросов группы B необходимо в качестве параметров указать следующие опции:
161
начало блока данных структур и конец load_libraries l_libs_start,end_l_libs, где
162
 
163
l_libs_start:
164
library01  l_libs boxlib_name, path, file_name, system_dir, \
165
er_message_found_lib, ihead_f_l, myimport, er_message_import, ihead_f_i
166
 
167
library02  l_libs plugin_BMP_name, path, file_name, system_dir1,\
168
er_message_found_lib2, ihead_f_l, myimport, er_message_import2, ihead_f_i
169
end_l_libs:
170
 
171
Вот такая запись
172
library01  l_libs boxlib_name, path, file_name, system_dir, \
173
er_message_found_lib, ihead_f_l, myimport, er_message_import, ihead_f_i
174
раскрывается в следующее:
175
 
176
.library_name   dd library_name
177
.cur_dir_path   dd cur_dir_path
178
.library_path   dd library_path
179
.system_path    dd system_path
180
.err_message_found_lib   dd err_message_found_lib
181
.head_f_l       dd head_f_l
182
.my_import      dd my_import
183
.err_message_import      dd err_message_import
184
.head_f_i       dd head_f_i
185
;выше полностью соответствует значениям для параметров группы макросов А.
186
.adr_load_lib   dd 0x0          ; адрес загруженной библиотеки
187
.status_lib     dd 0x0          ;status of load library - статус коды могут принимать значение 0 - успешно, 0х1 - ошибка поиска библиотеки, 0х2 - ошибка импорта функций.
188
 
189
Если нужно узнать программе, как загрузилась библиотека, используем следующую проверку:
190
 
191
;проверка на сколько удачно загрузилась наша библиотека
192
        mov     ebp,library01 - метка структуры
193
        cmp     dword [ebp+ll_struc_size-4],0 ; тут проверяем код статуса возврата
194
        jnz     exit ;если не 0, то уходим.
195
 
196
 
197
;получение адреса загруженной библиотеки
198
        mov     ebp,library01 - метка структуры
199
        cmp     dword [ebp+ll_struc_size-4],0 ; тут проверяем код статуса возврата
200
        jnz     exit ;если не 0, то уходим.
201
        mov     ebp, dword [ebp+ll_struc_size-8] - в ebp адрес начала.
202
 
203
Макорос @use_library
204
 
205
Этот макрос представляет вызываемые процедуры, которые используются для работы групп макросов А и B. Данный макрос располагается в секции дата. Использование данного макроса обязательно.
206
 
207
 
208
Как я могу использовать макрос загрузки библиотеки/библиотек в своей программе?
209
 
210
Общий шаблон для использования библиотеки такой:
211
 
212
use32                ; транслятор, использующий 32 разрядных команды
213
    org 0x0                ; базовый адрес кода, всегда 0x0
214
    db 'MENUET01'        ; идентификатор исполняемого файла (8 байт)
215
    dd 0x1                ; версия формата заголовка исполняемого файла
216
    dd start                ; адрес, на который система передаёт управление
217
                        ; после загрузки приложения в память
218
    dd i_end                ; размер приложения
219
    dd mem                  ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта
220
    dd mem                  ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше
221
    dd 0x0              ; указатель на строку с параметрами.
222
    dd cur_dir_path
223
include 'macros.inc'
224
include 'editbox_ex.mac'
225
include 'load_lib.mac'
226
        @use_library    ;use load lib macros
227
start:
228
;universal load library/librarys
229
sys_load_library  library_name, cur_dir_path, library_path, system_path, \
230
err_message_found_lib, head_f_l, myimport, err_message_import, head_f_i
231
;if return code =-1 then exit, else nornary work
232
        cmp     eax,-1
233
        jz      exit
234
        mcall   40,0x27         ;установить маску для ожидаемых событий
235
red_win:
236
    call draw_window            ;первоначально необходимо нарисовать окно
237
align 4
238
still:                          ;основной обработчик
239
        mcall   10              ;Ожидать события
240
        dec  eax
241
        jz   red_win
242
        dec  eax
243
        jz   key
244
        dec  eax
245
        jz   button
246
 
247
        push    dword edit1
248
        call    [edit_box_mouse]
249
 
250
        push    dword edit2
251
        call    [edit_box_mouse]
252
 
253
        push    dword check1
254
        call    [check_box_mouse]
255
 
256
        push    dword check2
257
        call    [check_box_mouse]
258
 
259
        push    dword Option_boxs
260
        call    [option_box_mouse]
261
 
262
        push    dword Option_boxs2
263
        call    [option_box_mouse]
264
 
265
        jmp still    ;если ничего из перечисленного то снова в цикл
266
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
267
button:
268
        mcall   17      ;получить идентификатор нажатой клавиши
269
        test ah,ah      ;если в ah 0, то перейти на обработчик событий still
270
        jz  still
271
exit:   mcall   -1
272
key:
273
        mcall   2       ;загрузим значение 2 в регистор eax и получим код нажатой клавиши
274
 
275
        push    dword edit1
276
        call    [edit_box_key]
277
 
278
        push    dword edit2
279
        call    [edit_box_key]
280
 
281
        jmp still
282
 
283
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
284
align 4
285
draw_window:            ;рисование окна приложения
286
        mcall   12,1
287
        mcall   0,(50*65536+390),(30*65536+200),0x33AABBCC,0x805080DD,hed
288
 
289
        push    dword edit1
290
        call    [edit_box_draw]
291
 
292
        push    dword edit2
293
        call    [edit_box_draw]
294
 
295
        push    dword check1
296
        call    [check_box_draw]
297
 
298
        push    dword check2
299
        call    [check_box_draw]
300
 
301
        push    dword Option_boxs
302
        call    [option_box_draw]
303
 
304
        push    dword Option_boxs2
305
        call    [option_box_draw]
306
 
307
        mcall   12,2
308
    ret
309
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
310
;DATA данные
311
;Всегда соблюдать последовательность в имени.
312
system_path      db '/sys/lib/'
313
library_name     db 'box_lib.obj',0
314
; Если есть желание разъединить, то нужно использовать следующию конструкцию
315
;system_path      db '/sys/lib/box_lib.obj',0
316
;... любая последовательность других команд и определений.
317
;library_name     db 'box_lib.obj',0
318
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
319
 
320
err_message_found_lib   db 'Sorry I cannot load library box_lib.obj',0
321
head_f_i:
322
head_f_l        db 'System error',0
323
err_message_import      db 'Error on load import library box_lib.obj',0
324
 
325
myimport:
326
 
327
edit_box_draw   dd      aEdit_box_draw
328
edit_box_key    dd      aEdit_box_key
329
edit_box_mouse  dd      aEdit_box_mouse
330
version_ed      dd      aVersion_ed
331
 
332
check_box_draw  dd      aCheck_box_draw
333
check_box_mouse dd      aCheck_box_mouse
334
version_ch      dd      aVersion_ch
335
 
336
option_box_draw  dd      aOption_box_draw
337
option_box_mouse dd      aOption_box_mouse
338
version_op       dd      aVersion_op
339
 
340
                dd      0
341
                dd      0
342
 
343
aEdit_box_draw  db 'edit_box',0
344
aEdit_box_key   db 'edit_box_key',0
345
aEdit_box_mouse db 'edit_box_mouse',0
346
aVersion_ed     db 'version_ed',0
347
 
348
aCheck_box_draw  db 'check_box_draw',0
349
aCheck_box_mouse db 'check_box_mouse',0
350
aVersion_ch      db 'version_ch',0
351
 
352
aOption_box_draw  db 'option_box_draw',0
353
aOption_box_mouse db 'option_box_mouse',0
354
aVersion_op       db 'version_op',0
355
 
356
 
357
 
358
 
359
check1 check_box 10,45,6,12,0x80AABBCC,0,0,check_text,14,ch_flag_en
360
check2 check_box 10,60,6,12,0x80AABBCC,0,0,check_text2,15
361
 
362
edit1 edit_box 350,3,5,0xffffff,0x6f9480,0,0xAABBCC,0,308,hed,ed_focus,hed_end-hed-1,hed_end-hed-1
363
edit2 edit_box 350,3,25,0xffffff,0x6a9480,0,0,0,99,ed_buffer,ed_figure_only
364
 
365
op1 option_box option_group1,10,90,6,12,0xffffff,0,0,op_text.1,op_text.e1-op_text.1
366
op2 option_box option_group1,10,105,6,12,0xFFFFFF,0,0,op_text.2,op_text.e2-op_text.2
367
op3 option_box option_group1,10,120,6,12,0xffffff,0,0,op_text.3,op_text.e3-op_text.3
368
op11 option_box option_group2,120,90,6,12,0xffffff,0,0,op_text.1,op_text.e1-op_text.1
369
op12 option_box option_group2,120,105,6,12,0xffffff,0,0,op_text.2,op_text.e2-op_text.2
370
op13 option_box option_group2,120,120,6,12,0xffffff,0,0,op_text.3,op_text.e3-op_text.3
371
 
372
option_group1   dd op1  ;указатели, они отображаются по умолчанию, когда выводится
373
option_group2   dd op12 ;приложение
374
Option_boxs     dd  op1,op2,op3,0
375
Option_boxs2    dd  op11,op12,op13,0
376
hed db   'BOXs load from lib  date 27.04.2009',0
377
hed_end:
378
rb  256
379
check_text db 'First checkbox'
380
check_text2 db 'Second checkbox'
381
op_text:                ; Сопровождающий текст для чек боксов
382
.1 db 'Option_Box #1'
383
.e1:
384
.2 db 'Option_Box #2'
385
.e2:
386
.3 db 'Option_Box #3'
387
.e3:
388
ed_buffer       rb 100
389
;-----------------------
390
;sc      system_colors
391
p_info  process_information
392
cur_dir_path    rb 4096
393
library_path    rb 4096
394
i_end:
395
rb 1024
396
mem: