Page 13 of 15

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 байта - самый короткий вариант.

Posted: Mon Dec 04, 2006 5:47 pm
by andrew_programmer
Я над байтами не задумывался.Что было в consol.asm ,то и содрал.

Posted: Mon Dec 04, 2006 7:14 pm
by diamond
[diamond удивлённо лезет в исходники k0630_src/dll/console/console.asm и обнаруживает полное отсутствие инструкции not]

Code: Select all

START:
        push    68
        pop     eax
        push    11
        pop     ebx
        int     0x40
        or      eax, -1
        ret     4

Posted: Mon Dec 04, 2006 10:06 pm
by andrew_programmer
diamond,консоль я скачал с твоего сайта.Я думал,что она такая же,как и в исходниках 0630.

Posted: Tue Dec 05, 2006 7:02 pm
by diamond
Не может быть. Я точно не выкладывал на свой сайт версию с not eax. В любом случае, обнови библиотеку консоли - там исправлена пара ошибок по отношению к версии из дистрибутива. Текущая версия http://diamondz.land.ru/console.7z совершенно точно содержит код, приведённый выше.

Posted: Sun Jan 07, 2007 3:26 am
by maxxx
Предлагаю пример динамической загрузки функции из dll на основе mpc от mike.dld:
http://winconsul.kladovka.net.ru/trash/Sample_DLL.zip (110 Кб)

код загрузки выглядит так:
hLib:=LoadLibrary('/rd/1/console.obj');
pStart:= GetProcAdress(hLib,'START');
в pStart адрес функции, где
hLib,pStart:integer;
исполнение функции по адресу в pStart проиходится делать в asm вставках:
asm
stdcall [__PSTART],1
end;

применительно к слабой поддержке строк в mpc (плюс отсутсвие поддержки типов переменных и других особенностей):
если импортируемая функция работает со строками, то приходится её выносить отдельно:
procedure ConWriteAsciiz(i:integer;text:string);
begin asm
stdcall [__PCONWRITEASCIIZ],[__I],[__TEXT]
end; end;

и вызове указывать строку непосредственно в функции:
ConWriteAsciiz(7,'Hello from Sample_DLL');

//----------

у меня есть вопрос к разработчикам ядра :)
в исходнике ядра Колибри v 0.6.0.0 (файл dll.inc) кроме функции load_library есть функция "proc get_proc stdcall, exp:dword, sz_name:dword"
так почему бы не сделать её доступной? будет проще импортировать интересующую функцию из dll