Как вернуть в плагин результат работы макроса?

Место, где разработчики плагинов могут поделиться своим опытом.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by Shmuel »

Latest post of the previous page:

Если вся проблема - в вычислении условий, то-есть при этом не надо посылать клавиши Фару и т.п., то проблема видится просто в том, что некоторые данные, доступные макросам, недоступны через API плагинов, и восполнение этого недостатка решило бы эту проблему. Так?

Пока я тут сочинял, ты успел добавить текст. Идея синхронного запуска - хорошая, буду думать.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Spring — внедрение Lua в качестве макроязыка

Post by NightRoman »

Наверное, не совсем так. Условие-то должно быть записано пользователем в виде скрипта. И плагин этот скрипт (макрос) должен запустить и получить результат.

Пока я сочинял, тоже добавился текст. ОК.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Spring — внедрение Lua в качестве макроязыка

Post by Shmuel »

NightRoman wrote:Наверное, не совсем так. Условие-то должно быть записано пользователем в виде скрипта. И плагин этот скрипт (макрос) должен запустить и получить результат.
Нет никакой проблемы уже сейчас добавить функцию в API плагинов, которая бы вызывала Lua-скрипт синхронно и возвращала бы результат (один или более). Загвоздка в том, видимо, что этот скрипт не должен посылать клавиш или делать прочие операции, для которых нужно быть внутри цикла опроса и обработки событий.

Примечание модератора: MCTL_EXECSTRING
stasf
Posts: 113
Joined: Wed 10 Dec, 2014 22:53
Has thanked: 3 times
Been thanked: 1 time

Как вернуть в плагин результат работы макроса?

Post by stasf »

Очень извиняюсь за возрат к старой закрытой теме, но как все-таки правильно принимать входящие параметры и отдавать результат в макросе, вызываемом из плагина с помощью MCTL_EXECSTRING ?
Что-то не могу найти где это описано :-(
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Как вернуть в плагин результат работы макроса?

Post by Shmuel »

http://api.farmanager.com/ru/service_fu ... EXECSTRING
Только это не вызов макроса, это синхронный вызов Lua-кода.
stasf
Posts: 113
Joined: Wed 10 Dec, 2014 22:53
Has thanked: 3 times
Been thanked: 1 time

Как вернуть в плагин результат работы макроса?

Post by stasf »

Это - со стороны плагина, с этим вопросов нет.
А как в Lua-коде параметры принять и результат(ы) вернуть?

Особенно интересен случай, когда исполняется строка кода, начинающаяся с "@".
Параметры, естественно, нужно принять в коде, хранящемся в целевом файле...
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Как вернуть в плагин результат работы макроса?

Post by Shmuel »

Code: Select all

local param1, param2, param3 = ...
-- do something
return ret1, ret2, ret3
stasf
Posts: 113
Joined: Wed 10 Dec, 2014 22:53
Has thanked: 3 times
Been thanked: 1 time

Как вернуть в плагин результат работы макроса?

Post by stasf »

Shmuel wrote:

Code: Select all

local param1, param2, param3 = ...
-- do something
return ret1, ret2, ret3
Что-то не очень у меня получается... :-(

Вот вызов Lua-кода:

Code: Select all

	FarMacroValue      FMV = {FMVT_STRING};
	FMV.String             = L"Hello";
	MacroExecuteString MES = {sizeof(MacroExecuteString), KMFLAGS_LUA, (const wchar_t*)sMacro, 1, &FMV};
	if (!PSI.MacroControl(&MainGuid, MCTL_EXECSTRING, 0, &MES)) {
		ShowText(L"Macro Call failed!");
		return FALSE;
	}
Вот сам Lua-код:

Code: Select all

local parm1 = ...
far.Message (parm1)
return "world"
Ожидаю, что Lua-код скажет мне "Hello", а он говорит вот что:

Code: Select all

== Message ===
¦ 1782422838 ¦
¦------------¦
¦   { OK }   ¦
==============
При этом строка "world" возвращается в плагин нормально.

Не подскажете, что я не так делаю?
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Как вернуть в плагин результат работы макроса?

Post by Shmuel »

stasf wrote: Не подскажете, что я не так делаю?
Просмотрев ваш код, ошибок не обнаружил, следовательно место ошибки осталось за кадром.
Специально собрал плагин практически с вашим кодом (только на C, а не C++), и он выводит "Hello", а не 1782422838.

Code: Select all

HANDLE PLUGIN_API OpenW (const struct OpenInfo *opInfo)
{
   if (opInfo->OpenFrom == OPEN_COMMANDLINE)
   {
      const wchar_t* sMacro = L"local parm1 = ...\nfar.Message (parm1)\nreturn \"world\"";
      struct FarMacroValue FMV = {FMVT_STRING};
      FMV.Value.String = L"Hello";
      struct MacroExecuteString MES = {sizeof(struct MacroExecuteString), KMFLAGS_LUA, sMacro, 1, &FMV};
      Info.MacroControl(&Guid, MCTL_EXECSTRING, 0, &MES);
   }
   return NULL;
}
stasf
Posts: 113
Joined: Wed 10 Dec, 2014 22:53
Has thanked: 3 times
Been thanked: 1 time

Как вернуть в плагин результат работы макроса?

Post by stasf »

В моем случае

Code: Select all

const wchar_t* sMacro = L"@c:\path_to\test";
Может, проблема как-то с этим связана?
Все остальное, кажется, у нас полностью аналогично...
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Как вернуть в плагин результат работы макроса?

Post by Shmuel »

stasf wrote: Может, проблема как-то с этим связана?
Нет, у меня и это работает правильно.
Может быть лучше, чем гадать, показать ваш код?
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Как вернуть в плагин результат работы макроса?

Post by Skirda »

stasf wrote:В моем случае

Code: Select all

const wchar_t* sMacro = L"@c:\path_to\test";
const wchar_t* sMacro = L"@c:\\path_to\\test";
не?
We are the Borg. You will be assimilated.
So Say We All!
User avatar
HaRT
Moderator
Posts: 10822
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Как вернуть в плагин результат работы макроса?

Post by HaRT »

Skirda wrote:
stasf wrote:В моем случае

Code: Select all

const wchar_t* sMacro = L"@c:\path_to\test";
const wchar_t* sMacro = L"@c:\\path_to\\test";
не?
Подозреваю, что автор хотел получить raw string literal, как в C#, и для этого влепил собаку (правда, в итоге всё равно не туда), но в C++ это по-другому, притом только с C++11.
Фар есть инструмент, а не нянька. © 2009 DrKnS
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Как вернуть в плагин результат работы макроса?

Post by Shmuel »

Поскольку, по информации автора, диалог с сообщением всё же выводится (только с неправильным сообщением), это говорит о том, что обе вышеуказанные гипотезы неверны. Скрипт-файл находится и исполняется. А вот тот ли это файл, содержимое которого привёл автор, это другой вопрос.

Добавлено:
Поведение, описываемое автором (вывод числа вместо "Hello"), можно получить, если вместо FMVT_STRING указать FMVT_INTEGER.
stasf
Posts: 113
Joined: Wed 10 Dec, 2014 22:53
Has thanked: 3 times
Been thanked: 1 time

Как вернуть в плагин результат работы макроса?

Post by stasf »

Shmuel wrote: .
Поведение, описываемое автором (вывод числа вместо "Hello"), можно получить, если вместо FMVT_STRING указать FMVT_INTEGER.
Ага, я тоже до этого допер...

Более того, оказалось, что это не просто число, а десятичное представление АДРЕСА ПАМЯТИ, по которому располагается строка "Hello".
Поняв это, я и ошибку нашел. И оказалась она, как ни странно, вот в этой строке:

Code: Select all

   FarMacroValue      FMV = {FMVT_STRING};
В результате такой инициализации FMV.Type принимает значение FMVT_INTEGER !!!

Оправившись от шока, я нашел и объяснение этому неочевидному эффекту (в файле plugin.hpp):

Code: Select all

#ifdef __cplusplus
	. . .
	FarMacroValue(int v)              { Type=FMVT_INTEGER; Integer=v; }
	. . .
#endif
Вот этот вот заботливый конструктор и обеспечил меня удовольствием на пол ночи :-))
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Как вернуть в плагин результат работы макроса?

Post by Shmuel »

stasf wrote: Вот этот вот заботливый конструктор и обеспечил меня удовольствием на пол ночи
Конструктор, тем не менее, в полном порядке.
Используете вы его неправильно. Visual Studio 10 такой код вообще не пропускает. Вы, видимо, собирали с GCC.
GCC, на мой взгляд, мог бы хоть предупреждение выдать, это да.
Post Reply

Return to “Разработка плагинов”