Менеджер DLL в MeOS

Discussing libraries simplifying applications development
  • попытался портировать на metcc этот пример, вылетает с ошибкой http://victor.kolibrios.org/download/testpr.JPG
    по рисунку видно что вылетает в функции link после получении адреса первых двух функций из импорта или в getproc при попытке получить третий.
    http://victor.kolibrios.org/download/console/ - там файлы которые я правил
  • почему описани функций всё ещё нет на svn в docs?
    Потому что их никто не добавил. Описание есть в sysfuncr.txt из дистрибутива, а также в приложении docpak из дистрибутива.
    пример DLL не работает в эмуляторе.
    В дистрибутиве лежит новая, корректная версия console.obj, использующая для выделения памяти не 64-ю функцию, а новую 68.12. Дело в том, что загрузка DLL подразумевает неявную инициализацию кучи процесса, после которой вызовы 64-й функции проваливаются (о чём написано в документации и предупреждает эмулятор). Исходники, между прочим, честно выложены в папке k0630_src.7z/dll/console.
  • Я хочу создать 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'
  • 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
  • >Я не понял как такой код должен работать. Ты записываешь в стек ebx (pipette_cursor), а потом делаешь возврат, то есть фактически переходишь на адрес pipette_cursor.


    Я хотел получить в стеке указатель на начало данных(определённого курсора) в 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 цветов.
  • 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 байта - самый короткий вариант.
  • Я над байтами не задумывался.Что было в consol.asm ,то и содрал.
  • [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
    
  • diamond,консоль я скачал с твоего сайта.Я думал,что она такая же,как и в исходниках 0630.
  • Не может быть. Я точно не выкладывал на свой сайт версию с not eax. В любом случае, обнови библиотеку консоли - там исправлена пара ошибок по отношению к версии из дистрибутива. Текущая версия http://diamondz.land.ru/console.7z совершенно точно содержит код, приведённый выше.
  • Предлагаю пример динамической загрузки функции из 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
  • Who is online

    Users browsing this forum: No registered users and 15 guests