DLL для LUA плагина

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

DLL для LUA плагина

Post by John Doe »

Latest post of the previous page:

Вот тут определённо ошибка:

Code: Select all

ifndef FARDIR
  FARDIR = ..\..\..\..
endif
Лишний \.., видимо забыли исправить.
(после каких-то изменений в luaplug.mak под FARDIR понимается уже другая папка: trunk, a не trunk/unicode_far как раньше)

И приведённый в пример makefile соответственно тоже нуждается в правке.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

DLL для LUA плагина

Post by Shmuel »

John Doe wrote: Вот тут определённо ошибка:
Да, это ошибка. Она у меня не проявляется ни в одном плагине, т.к. каждый плагин сам определяет переменную FARDIR (как абсолютный путь). Тем не менее, спасибо, исправлю.
John Doe wrote: И приведённый в пример makefile соответственно тоже нуждается в правке.
На момент написания всё было правильно, сломалось в результате модификации через полгода. Полагаю, что подобных сообщений (и не только моих), которые содержат неработающий на данный момент код, полно в форуме.

Тем не менее, если считаете нужным, можете добавить примечание (только не правьте оригинальный текст).
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

DLL для LUA плагина

Post by John Doe »

Shmuel wrote: подобных сообщений [...], которые содержат неработающий на данный момент код, полно в форуме
Ну свои я например правлю, или добавляю ссылки на рабочий код...

И ещё такой вопрос. В luaplug.mak по умолчанию библиотеки ищутся тут: PATH_LIBS = $(FARDIR)\unicode_far\Release.$(DIRBIT).vc
Интересно почему такое умолчание?
И как можно усовершенствовать luaplug.mak, чтобы учитывался и вариант сборки gcc?
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

DLL для LUA плагина

Post by Shmuel »

John Doe wrote: Ну свои я например правлю, или добавляю ссылки на рабочий код...
Я себе такой задачи не ставлю. Если после сообщения прошёл день-два, я о нём благополучно забываю.
John Doe wrote: Интересно почему такое умолчание?
Потому что оно удобно лично мне. (Не забывайте, что luaplug.mak приведен только как пример, и в билде luamacro.dll он не участвует).
John Doe wrote: И как можно усовершенствовать luaplug.mak, чтобы учитывался и вариант сборки gcc?
Определяйте в своём мейк-файле PATH_LIBS = $(FARDIR)\unicode_far\Release.$(DIRBIT).gcc выше строчки включения luaplug.mak
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

DLL для LUA плагина

Post by John Doe »

Shmuel wrote: Я себе такой задачи не ставлю. Если после сообщения прошёл день-два, я о нём благополучно забываю.
Я тоже не ставлю себе такой задачи, но если уж натыкаюсь, то обычно правлю.
Shmuel wrote: luaplug.mak приведен только как пример
Я понимаю. И предлагаю добавить и второй возможный путь, чтобы пример было проще использовать (я не раз уже напарывался по невнимательности).
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

DLL для LUA плагина

Post by Shmuel »

John Doe wrote: Я тоже не ставлю себе такой задачи, но если уж натыкаюсь, то обычно правлю.
Честь и хвала за это (и не только за это).
John Doe wrote: предлагаю добавить и второй возможный путь, чтобы пример было проще использовать.
Это повлечёт за собой и дополнение к документации. А времени нет.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

DLL для LUA плагина

Post by John Doe »

А если как-то так:

Code: Select all

ifndef PATH_LIBS
  INCLUDE = -L$(FARDIR)\unicode_far\Release.$(DIRBIT).gcc -L$(FARDIR)\unicode_far\Release.$(DIRBIT).vc
else
  INCLUDE = -L$(PATH_LIBS)
endif
Shmuel wrote: Это повлечёт за собой и дополнение к документации.
Да нет, там сейчас вообще не описан параметр PATH_LIBS.
Как и DIRBIT.

Т.е. дополнение требуется, но это не связанно с предлагаемыми изменениями luaplug.mak
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

DLL для LUA плагина

Post by Shmuel »

Странный вы человек. Я же сказал - нет времени. С трудом на починку багов выкраиваю, и то не уверен, что смогу дальше так продолжать.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

DLL для LUA плагина

Post by John Doe »

Shmuel wrote:Я же сказал - нет времени.
Я тоже проясню.
Себе я makefile сделал, соответственно лично мне ничего в этом плане не требуется.

Но недостатки имеются, так почему бы их не обсудить?
Результат обсуждения будет оформлен на мантисе (что тоже никого не обязывает)
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

DLL для LUA плагина

Post by techie »

Shmuel wrote: Wed 10 Sep, 2014 17:48Эти DLL отличаются набором экспортируемых функций. luamacro.dll имеет свой набор, helloworld.dll - свой, и т.д.
Этот набор определяется в мейк-файле, а при сборке с VC2010 также и в .def-файле. Подробнее - в мануале LuaFAR.
Я понимаю, что для плагинописателей есть очевидные вещи, но как чайник я всё равно не догоняю - зачем плагину на Lua дополнительная кастомная DLL для экспорта функций? Почему адаптер, который загружает Lua скрипты не может динамически читать и экспортировать для Far нужные функции?
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

DLL для LUA плагина

Post by techie »

Раз уж без luaplug.dll не обойтись, где её взять? Переименовать LuaMacro.dll покатит? Текущая таблица экспорта из неё:

Code: Select all

0x100065d0 ConfigureW 1
0x100066f0 ExitFARW 2
0x10006750 GetGlobalInfoW 3
0x100067e0 GetLuaState 4
0x10006820 GetMinFarVersionW 5
0x10006830 GetPluginInfoW 6
0x10006990 OpenW 7
0x10006a30 ProcessConsoleInputW 8
0x10006a80 ProcessDialogEventW 9
0x10006ad0 ProcessEditorEventW 10
0x10006b20 ProcessEditorInputW 11
0x10006b70 ProcessSynchroEventW 12
0x10006bc0 ProcessViewerEventW 13
0x10006d00 SetStartupInfoW 14
0x10006e40 luaopen_luaplug 15
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

DLL для LUA плагина

Post by techie »

Почему не включить генерирование luaplug.dll в PluginSDK при сборке Far?
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

DLL для LUA плагина

Post by John Doe »

techie wrote: Mon 10 Jul, 2017 06:49 Почему адаптер, который загружает Lua скрипты
"Адаптеры" появились позже, а LuaFAR работает иначе.
techie wrote: Mon 10 Jul, 2017 08:34Переименовать LuaMacro.dll покатит?
Можно и так, хотя на самом деле к luaplug прилагается шаблон makefile, позволяющий собрать dll с нужными экспортами.
techie wrote: Mon 10 Jul, 2017 08:35Почему не включить генерирование luaplug.dll в PluginSDK при сборке Far?
Потому что никто не знает заранее какие экспорты нужны вашему плагину.
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

DLL для LUA плагина

Post by techie »

John Doe wrote: Mon 10 Jul, 2017 08:39Потому что никто не знает заранее какие экспорты нужны вашему плагину.
Я вот тоже не знаю. Вопрос зачем нужны экспорты нигде не описан, и при этом постоянная путаница - я так понимаю есть функции, которые экспортирует сам Far и плагины могут их использовать, а есть функции экспортируемые плагином которые вызывает сам Far (callbacks). Так в DLL речь идёт о последних, правильно? Соответственно, экспорты нужны, если мой плагин на Lua хочет предоставить Far возможность вызова этих callbacks.

Есть какой-то список обязательный callbacks, который плагин на Lua должен поддерживать?

Я правильно понимаю, что для обычных плагинов обязательно нужно, чтобы экспортировался OpenW. Если плагин его не экспортирует, то Far не считает плагин за плагин, так? То же самое и с Lua? Если luaplug.dll не определяет OpenW то чтобы в скрипте не писалось, оно не вызовется.

А если luaplug.dll определяет OpenW, а в скрипте ничего нет - что должно произойти?
Если ничего, то может в эту luaplug.dll запихать все возможные callbacks, которые Far может дёрнуть?
Last edited by techie on Mon 10 Jul, 2017 09:06, edited 1 time in total.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

DLL для LUA плагина

Post by zg »

techie wrote: Mon 10 Jul, 2017 09:04Есть какой-то список обязательный callbacks, который плагин на Lua должен поддерживать?
есть.
techie wrote: Mon 10 Jul, 2017 09:04Я правильно понимаю, что для обычных плагинов обязательно нужно, чтобы экспортировался OpenW.
неправильно.
techie wrote: Mon 10 Jul, 2017 09:04Если ничего, то может в эту luaplug.dll запихать все возможные callbacks, которые Far может дёрнуть?
можно, но возможно снижение производительности.
ladserg
Posts: 234
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 5 times
Been thanked: 6 times

DLL для LUA плагина

Post by ladserg »

Решил пересобрать dll'ки для своих плагинов, и чот у меня лыжи не сразу поехали. Посему на всякий случай приложу здесь краткий мануал, как я собирал dll для плагинов LUA Format Block, LUA Fast File List, LUA File List. Вдруг кому пригодится, или я сам прочитаю, если забуду :-)

В каталоге LUA плагина создаётся каталог src. В него кладутся три файла
  1. readme.txt
    Для сборки динамических библиотек плагина вам понадобится:
    1. GIT Клиент (я брал отсюда: https://git-scm.com/download/win).
    2. Сборка MinGW, поддерживающая сборку 64х разрядных бинарников, я взял сборку отсюда: (http://mingw-w64.sourceforge.net/downlo ... ngw-builds).
      При установке указанной мною сборки необходимо для опции Exception выбрать значение "sjlj", все остальные настройки можно оставить по умолчанию, тогда будет установлена x32 версия компилятора с возможностью сборки x64 бинарников. После чего в подкаталоге mingw32\bin каталога MinGW необходимо скопировать файл mingw32-make.exe в make.exe.
    3. В PATH должен быть добавлен путь до исполняемых файлов MinGW.
    Что бы собрать динамические библиотеки нужно запустить файл build.bat, при этом разово будут загружены исходники Far Manager в
    подкаталог !far_src каталога где лежит плагин.
  2. build.bat

    Code: Select all

    @echo off
    SET PNAME=lfblock
    SET FARDIR=..\..\!far_src
    IF NOT EXIST ..\..\!far_src (
        git clone https://github.com/FarGroup/FarManager.git %FARDIR%
        pushd %FARDIR%\plugins\luamacro
        make -f makefile_gcc DIRBIT=32 
        make -f makefile_gcc DIRBIT=64 
        popd
    )
    IF EXIST ..\..\!far_src (
        IF EXIST luaplug.o del luaplug.o
        make DIRBIT=32 TARGET=..\%PNAME%-x32.dll SRCDIR=%FARDIR% ^
            MYLDFLAGS="-L%FARDIR%\far\Release.32.gcc -L%FARDIR%\plugins\luamacro\luasdk\32"^
            CC=gcc
        IF EXIST luaplug.o del luaplug.o
        make DIRBIT=64 TARGET=..\%PNAME%-x64.dll SRCDIR=%FARDIR% ^
            MYLDFLAGS="-L%FARDIR%\far\Release.64.gcc -L%FARDIR%\plugins\luamacro\luasdk\64"^
            CC=gcc
        IF EXIST luaplug.o del luaplug.o
    )
    
  3. makefile:

    Code: Select all

    # ---- user's settings -------------------------------------------------------
    
    TARGET      = test.dll
    FAR_EXPORTS = OPEN
    SRCDIR      = ..\..\!far_src
    FARDIR      = $(SRCDIR)
    
    # ---- end of user's settings ------------------------------------------------
    include $(SRCDIR)\plugins\luamacro\luafar\luaplug.mak
    
    # (end of Makefile)
    
Остаётся прочитать readme.txt, и следовать его указаниям. Не против, если кто будет использовать данный материал в своих плагинах.

Без указания путей до библиотек lua51, luafar3 и без указания компилятора, dll у меня не собрались. Возможно это пофиксят, т.к. раньше они не требовались.
Last edited by ladserg on Thu 12 Mar, 2020 02:09, edited 1 time in total.
Post Reply

Return to “Нужна помощь”