Page 12 of 15

Posted: Fri Oct 27, 2006 7:00 pm
by Serge
Добро пожаловать в DLL hell!

Фунция 68.19 - загрузить DLL. ecx - указатель на путь к библиотеке.
Возвращаемое значение - логический номер DLL в случае успеха или 0.

http://infinity-sound.narod.ru/console.7z - пример DLL
консоли.

ДЛЛ может состоять из нескольких COFF секций. Кождая DLL должна иметь таблицу экспортируемых функций. Метка EXPORTS должна быть объявлена public. Обязательная функция stdcall START должна вызываться с параметром state=1 после загрузки DLL и state=-1 перед выгрузкой. Функция должна вернуть ненулевое значение в случае успхе или ноль в случае неудачи. Каждая DLL должна содержать номер версии (экспоруемое имя 'version'). Младшее слово версии - текущая версия DLL, старшее слово - минимальная совместимая версия. Программа может работать с DLL если требуемая версия не больше текущей и не меньше совместимой. Таблица EXPORTS состоит из пар двойных слов. Первое - указатель на строку с именем переменной, второе значение. Экспортироваться могут не только адреса функций но и непосредственные данные как в случае с 'version'. В файл testcon2 добавлены две вспомогательные функции для работы с DLL. get_proc возвращает адрес экспортируемой переменной sz_name. link связывает библиотеку и программу. Для этого необходима таблица импортируемых функций (в примере imports). link заменяет адреса строк с именами функций на значения полученные после вызовов get_proc

Posted: Sat Oct 28, 2006 7:20 pm
by O01eg
и какое же ядро поддерживает 68.19?

Posted: Sat Oct 28, 2006 7:38 pm
by Serge
SVN.198+

Posted: Mon Nov 20, 2006 8:44 pm
by vectoroc
почему описани функций всё ещё нет на svn в docs?

Posted: Tue Nov 21, 2006 1:23 am
by vectoroc
http://infinity-sound.narod.ru/console.7z - пример DLL не работает в эмуляторе. Если заменить файл console.obj на тот что идёт в дистри 0630 то всё работает

Posted: Tue Nov 21, 2006 5:20 am
by Serge
С исходниками вышла какая-то путаница. Эта версия с явными ошибками а где нормальная я не знаю. У diamonda должна быть работающая версия. Надо выложить её на svn.
P.S. DLL можно паковать kpackом

Posted: Tue Nov 21, 2006 10:03 am
by vectoroc
попытался портировать на metcc этот пример, вылетает с ошибкой http://victor.kolibrios.org/download/testpr.JPG
по рисунку видно что вылетает в функции link после получении адреса первых двух функций из импорта или в getproc при попытке получить третий.
http://victor.kolibrios.org/download/console/ - там файлы которые я правил

Posted: Tue Nov 21, 2006 5:24 pm
by diamond
почему описани функций всё ещё нет на svn в docs?
Потому что их никто не добавил. Описание есть в sysfuncr.txt из дистрибутива, а также в приложении docpak из дистрибутива.
пример DLL не работает в эмуляторе.
В дистрибутиве лежит новая, корректная версия console.obj, использующая для выделения памяти не 64-ю функцию, а новую 68.12. Дело в том, что загрузка DLL подразумевает неявную инициализацию кучи процесса, после которой вызовы 64-й функции проваливаются (о чём написано в документации и предупреждает эмулятор). Исходники, между прочим, честно выложены в папке k0630_src.7z/dll/console.

Posted: Sun Dec 03, 2006 8:05 pm
by andrew_programmer
Я хочу создать dll-ку с курсорами.Сделал вариант dll.Пробовал из неё курсоры грузить - не работает.
Может я что- то неправильно организовал в dll-ке ?

Вот исходный код dll:

format MS COFF

public EXPORTS

section '.flat' code readable align 16


;void __stdcall START(dword state);
START:
xor eax, eax
not eax
ret 4

align 4
cursor_brush:

mov ebx,brus_cursor
push ebx
ret

align 4
cursor_flood_fill:

mov ebx,flood_fill_cursor
push ebx
ret

align 4
cursor_lastik:

mov ebx,lastik_cursor
push ebx
ret


align 4
cursor_other:

mov ebx,other_cursor
push ebx
ret

align 4
cursor_pencil:

mov ebx,pencil_cursor
push ebx
ret

align 4
cursor_pipette:

mov ebx,pipette_cursor
push ebx
ret

align 4
cursor_spray:

mov ebx,spray_cursor
push ebx
ret

align 4
cursor_zoom:

mov ebx,zoom_cursor
push ebx
ret

align 16
EXPORTS:
dd szStart, START
dd szBrush, cursor_brush
dd szFlood, cursor_flood_fill
dd szLastik, cursor_lastik
dd szOther, cursor_other
dd szPencil, cursor_pencil
dd szPipette, cursor_pipette
dd szSpray, cursor_spray
dd szZoom, cursor_zoom


szStart db 'START',0
szBrush db 'cursor_brush',0
szFlood db 'cursor_flood_fill',0
szLastik db 'cursor_lastik',0
szOther db 'cursor_other',0
szPencil db 'cursor_pencil',0
szPipette db 'cursor_pipette',0
szSpray db 'cursor_spray ',0
szZoom db 'cursor_zoom',0



section '.data' data readable writable align 16

brus_cursor:
file 'brush.cur'

flood_fill_cursor:
file 'flood_fill.cur'

lastik_cursor:
file 'lastik.cur'

other_cursor:
file 'other.cur'

pencil_cursor:
file 'pencil.cur'

pipette_cursor:
file 'pipette.cur'

spray_cursor:
file 'spray.cur'

zoom_cursor:
file 'zoom.cur'

Posted: Mon Dec 04, 2006 12:03 am
by Serge
andrew_programmer

align 4
cursor_pipette:

mov ebx,pipette_cursor
push ebx
ret

Я не понял как такой код должен работать. Ты записываешь в стек ebx (pipette_cursor), а потом делаешь возврат, то есть фактически переходишь на адрес pipette_cursor.

Не знаю нужна ли здесь DLL. Для загрузки системных курсоров хотел собрать их все вместе отдельным файлом и дальше грузить в цикле.

COUNT equ 3

dd COUNT
dd _3darrow
dd _3darrowm
dd _3darrowl

_3darrow:
file '3darrow.cur'
_3darrowm:
file '3darrowm.cur'
_3darrowl:
file '3dgarrowl.cur'


Ещё надо учесть что после загрузки DLL ф.64 перестаёт работать, так что выделять память надо через ф.68

Posted: Mon Dec 04, 2006 12:21 am
by andrew_programmer
>Я не понял как такой код должен работать. Ты записываешь в стек ebx (pipette_cursor), а потом делаешь возврат, то есть фактически переходишь на адрес pipette_cursor.


Я хотел получить в стеке указатель на начало данных(определённого курсора) в dll.Но ,как видно, неправильно реализовал эту идею.

>Не знаю нужна ли здесь DLL. Для загрузки системных курсоров хотел собрать их все вместе отдельным файлом и дальше грузить в цикле.

Как назовём этот файл ?
Чем будет упакован ?
Кто будет распаковывать файл с курсорами(если сама программа,то нужен распаковщик в виде dll) ?
В какой дериктории будет находиться файл с курсорами?

Курсоры для ANIMAGE готовы.Дизайн от goglus-а я приделал.Осталось только решить вышеописанные вопросы с курсорами.

Posted: Mon Dec 04, 2006 12:14 pm
by Serge
andrew_programmer
С системными курсорами ничего не ясно. Сколько их должно быть, как выглядеть и как называться. Никто ничего не предлагает.

Для программ проще компилировать курсоры вместе с кодом.
Примерно так:

Code: Select all

LOAD_FROM_MEM equ 1

для загрузки курсоров

      lea esi, cursor_brush
      mov edx, LOAD_FROM_MEM
      mov ebx, 4
@@:
      mov ecx, [esi]
      test ecx, ecx
      jz .done

      mov eax, 37
      int 0x40

      mov [esi], eax
      add esi, 4
      jmp @B
.done:

для установки нужного курсора

set_brush:
      mov eax, 37
      mov ebx, 5
      mov ecx, [cursor_brush]
      int 0x40
      ret

align 4
cursor_brush      dd brus_cursor
cursor_flood_fill dd flood_fill_cursor
cursor_lastik     dd lastik_cursor
cursor_other      dd other_cursor
cursor_pencil     dd pencil_cursor
...
...
dd 0 ;terminator

brus_cursor:
file 'brush.cur'
flood_fill_cursor:
file 'flood_fill.cur'
lastik_cursor:
file 'lastik.cur'
other_cursor:
file 'other.cur'
pencil_cursor:
file 'pencil.cur'
...
...

Posted: Mon Dec 04, 2006 2:59 pm
by andrew_programmer
>Для программ проще компилировать курсоры вместе с кодом.


Так эту идею я уже предлпгал ранее :) (вроде в теме про ATI находиться).
Если подключать к коду,то проблем с курсорами нет.

Posted: Mon Dec 04, 2006 5:09 pm
by Serge
andrew_programmer
Я специально сделал три способа загрузки курсоров: из файла, из программы и готовый ARGB образ. На все случаи жизни.
С #224 можно грузить полноцветные курсоры. Осталось добавить монохромные и 256 цветов.

Posted: Mon Dec 04, 2006 5:12 pm
by diamond

Code: Select all

;void __stdcall START(dword state); 
START: 
xor eax, eax 
not eax 
ret 4
Нафига так извращаться? xor eax,eax/not eax - 4 байта, mov eax,-1 - 5 байт, or eax,-1 или xor eax,eax/dec eax - 3 байта - самый короткий вариант.