Board.KolibriOS.org

Official KolibriOS board
It is currently Sun Oct 25, 2020 8:39 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 216 posts ]  Go to page Previous 111 12 13 14 15 Next
Author Message
 Post subject:
PostPosted: Tue Nov 21, 2006 5:20 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
С исходниками вышла какая-то путаница. Эта версия с явными ошибками а где нормальная я не знаю. У diamonda должна быть работающая версия. Надо выложить её на svn.
P.S. DLL можно паковать kpackом


Top
   
 Post subject:
PostPosted: Tue Nov 21, 2006 10:03 am 
Offline

Joined: Mon May 01, 2006 10:12 pm
Posts: 349
попытался портировать на metcc этот пример, вылетает с ошибкой http://victor.kolibrios.org/download/testpr.JPG
по рисунку видно что вылетает в функции link после получении адреса первых двух функций из импорта или в getproc при попытке получить третий.
http://victor.kolibrios.org/download/console/ - там файлы которые я правил


Top
   
 Post subject:
PostPosted: Tue Nov 21, 2006 5:24 pm 
Offline
Kernel Developer
User avatar

Joined: Mon Nov 28, 2005 8:00 pm
Posts: 1601
Quote:
почему описани функций всё ещё нет на svn в docs?

Потому что их никто не добавил. Описание есть в sysfuncr.txt из дистрибутива, а также в приложении docpak из дистрибутива.
Quote:
пример DLL не работает в эмуляторе.

В дистрибутиве лежит новая, корректная версия console.obj, использующая для выделения памяти не 64-ю функцию, а новую 68.12. Дело в том, что загрузка DLL подразумевает неявную инициализацию кучи процесса, после которой вызовы 64-й функции проваливаются (о чём написано в документации и предупреждает эмулятор). Исходники, между прочим, честно выложены в папке k0630_src.7z/dll/console.


Top
   
 Post subject:
PostPosted: Sun Dec 03, 2006 8:05 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Я хочу создать 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'


Top
   
 Post subject:
PostPosted: Mon Dec 04, 2006 12:03 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
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


Top
   
 Post subject:
PostPosted: Mon Dec 04, 2006 12:21 am 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
>Я не понял как такой код должен работать. Ты записываешь в стек ebx (pipette_cursor), а потом делаешь возврат, то есть фактически переходишь на адрес pipette_cursor.


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

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

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

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


Top
   
 Post subject:
PostPosted: Mon Dec 04, 2006 12:14 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
andrew_programmer
С системными курсорами ничего не ясно. Сколько их должно быть, как выглядеть и как называться. Никто ничего не предлагает.

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

Code:
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'
...
...


Top
   
 Post subject:
PostPosted: Mon Dec 04, 2006 2:59 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
>Для программ проще компилировать курсоры вместе с кодом.


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


Top
   
 Post subject:
PostPosted: Mon Dec 04, 2006 5:09 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
andrew_programmer
Я специально сделал три способа загрузки курсоров: из файла, из программы и готовый ARGB образ. На все случаи жизни.
С #224 можно грузить полноцветные курсоры. Осталось добавить монохромные и 256 цветов.


Top
   
 Post subject:
PostPosted: Mon Dec 04, 2006 5:12 pm 
Offline
Kernel Developer
User avatar

Joined: Mon Nov 28, 2005 8:00 pm
Posts: 1601
Code:
;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 байта - самый короткий вариант.


Top
   
 Post subject:
PostPosted: Mon Dec 04, 2006 5:47 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Я над байтами не задумывался.Что было в consol.asm ,то и содрал.


Top
   
 Post subject:
PostPosted: Mon Dec 04, 2006 7:14 pm 
Offline
Kernel Developer
User avatar

Joined: Mon Nov 28, 2005 8:00 pm
Posts: 1601
[diamond удивлённо лезет в исходники k0630_src/dll/console/console.asm и обнаруживает полное отсутствие инструкции not]
Code:
START:
        push    68
        pop     eax
        push    11
        pop     ebx
        int     0x40
        or      eax, -1
        ret     4


Top
   
 Post subject:
PostPosted: Mon Dec 04, 2006 10:06 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
diamond,консоль я скачал с твоего сайта.Я думал,что она такая же,как и в исходниках 0630.


Top
   
 Post subject:
PostPosted: Tue Dec 05, 2006 7:02 pm 
Offline
Kernel Developer
User avatar

Joined: Mon Nov 28, 2005 8:00 pm
Posts: 1601
Не может быть. Я точно не выкладывал на свой сайт версию с not eax. В любом случае, обнови библиотеку консоли - там исправлена пара ошибок по отношению к версии из дистрибутива. Текущая версия http://diamondz.land.ru/console.7z совершенно точно содержит код, приведённый выше.


Top
   
 Post subject:
PostPosted: Sun Jan 07, 2007 3:26 am 
Предлагаю пример динамической загрузки функции из 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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 216 posts ]  Go to page Previous 111 12 13 14 15 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited