Добро пожаловать в 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
Менеджер DLL в MeOS
и какое же ядро поддерживает 68.19?
SVN.198+
почему описани функций всё ещё нет на svn в docs?
http://infinity-sound.narod.ru/console.7z - пример DLL не работает в эмуляторе. Если заменить файл console.obj на тот что идёт в дистри 0630 то всё работает
С исходниками вышла какая-то путаница. Эта версия с явными ошибками а где нормальная я не знаю. У diamonda должна быть работающая версия. Надо выложить её на svn.
P.S. DLL можно паковать kpackом
P.S. DLL можно паковать kpackом
попытался портировать на metcc этот пример, вылетает с ошибкой http://victor.kolibrios.org/download/testpr.JPG
по рисунку видно что вылетает в функции link после получении адреса первых двух функций из импорта или в getproc при попытке получить третий.
http://victor.kolibrios.org/download/console/ - там файлы которые я правил
по рисунку видно что вылетает в функции link после получении адреса первых двух функций из импорта или в getproc при попытке получить третий.
http://victor.kolibrios.org/download/console/ - там файлы которые я правил
Потому что их никто не добавил. Описание есть в sysfuncr.txt из дистрибутива, а также в приложении docpak из дистрибутива.почему описани функций всё ещё нет на svn в docs?
В дистрибутиве лежит новая, корректная версия console.obj, использующая для выделения памяти не 64-ю функцию, а новую 68.12. Дело в том, что загрузка DLL подразумевает неявную инициализацию кучи процесса, после которой вызовы 64-й функции проваливаются (о чём написано в документации и предупреждает эмулятор). Исходники, между прочим, честно выложены в папке k0630_src.7z/dll/console.пример DLL не работает в эмуляторе.
Я хочу создать 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'
Может я что- то неправильно организовал в 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'
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
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
>Я не понял как такой код должен работать. Ты записываешь в стек ebx (pipette_cursor), а потом делаешь возврат, то есть фактически переходишь на адрес pipette_cursor.
Я хотел получить в стеке указатель на начало данных(определённого курсора) в dll.Но ,как видно, неправильно реализовал эту идею.
>Не знаю нужна ли здесь DLL. Для загрузки системных курсоров хотел собрать их все вместе отдельным файлом и дальше грузить в цикле.
Как назовём этот файл ?
Чем будет упакован ?
Кто будет распаковывать файл с курсорами(если сама программа,то нужен распаковщик в виде dll) ?
В какой дериктории будет находиться файл с курсорами?
Курсоры для ANIMAGE готовы.Дизайн от goglus-а я приделал.Осталось только решить вышеописанные вопросы с курсорами.
Я хотел получить в стеке указатель на начало данных(определённого курсора) в dll.Но ,как видно, неправильно реализовал эту идею.
>Не знаю нужна ли здесь DLL. Для загрузки системных курсоров хотел собрать их все вместе отдельным файлом и дальше грузить в цикле.
Как назовём этот файл ?
Чем будет упакован ?
Кто будет распаковывать файл с курсорами(если сама программа,то нужен распаковщик в виде dll) ?
В какой дериктории будет находиться файл с курсорами?
Курсоры для ANIMAGE готовы.Дизайн от goglus-а я приделал.Осталось только решить вышеописанные вопросы с курсорами.
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'
...
...
>Для программ проще компилировать курсоры вместе с кодом.
Так эту идею я уже предлпгал ранее
(вроде в теме про ATI находиться).
Если подключать к коду,то проблем с курсорами нет.
Так эту идею я уже предлпгал ранее
Если подключать к коду,то проблем с курсорами нет.
andrew_programmer
Я специально сделал три способа загрузки курсоров: из файла, из программы и готовый ARGB образ. На все случаи жизни.
С #224 можно грузить полноцветные курсоры. Осталось добавить монохромные и 256 цветов.
Я специально сделал три способа загрузки курсоров: из файла, из программы и готовый ARGB образ. На все случаи жизни.
С #224 можно грузить полноцветные курсоры. Осталось добавить монохромные и 256 цветов.
Code: Select all
;void __stdcall START(dword state);
START:
xor eax, eax
not eax
ret 4
Who is online
Users browsing this forum: No registered users and 5 guests