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

Место, где разработчики плагинов могут поделиться своим опытом.
stasf
Posts: 111
Joined: Wed 10 Dec, 2014 22:53
Has thanked: 2 times
Been thanked: 1 time

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

Post by stasf » Sun 25 Oct, 2015 20:18

Latest post of the previous page:

Очень извиняюсь за возрат к старой закрытой теме, но как все-таки правильно принимать входящие параметры и отдавать результат в макросе, вызываемом из плагина с помощью MCTL_EXECSTRING ?
Что-то не могу найти где это описано :-(

Shmuel
Posts: 5040
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

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

Post by Shmuel » Sun 25 Oct, 2015 20:24

http://api.farmanager.com/ru/service_fu ... EXECSTRING
Только это не вызов макроса, это синхронный вызов Lua-кода.

stasf
Posts: 111
Joined: Wed 10 Dec, 2014 22:53
Has thanked: 2 times
Been thanked: 1 time

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

Post by stasf » Mon 26 Oct, 2015 19:45

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

Особенно интересен случай, когда исполняется строка кода, начинающаяся с "@".
Параметры, естественно, нужно принять в коде, хранящемся в целевом файле...

Shmuel
Posts: 5040
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

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

Post by Shmuel » Mon 26 Oct, 2015 20:23

Code: Select all

local param1, param2, param3 = ...
-- do something
return ret1, ret2, ret3

stasf
Posts: 111
Joined: Wed 10 Dec, 2014 22:53
Has thanked: 2 times
Been thanked: 1 time

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

Post by stasf » Sun 08 Nov, 2015 22:14

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: 5040
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

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

Post by Shmuel » Sun 08 Nov, 2015 22:46

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: 111
Joined: Wed 10 Dec, 2014 22:53
Has thanked: 2 times
Been thanked: 1 time

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

Post by stasf » Mon 09 Nov, 2015 09:22

В моем случае

Code: Select all

const wchar_t* sMacro = L"@c:\path_to\test";
Может, проблема как-то с этим связана?
Все остальное, кажется, у нас полностью аналогично...

Shmuel
Posts: 5040
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

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

Post by Shmuel » Mon 09 Nov, 2015 09:48

stasf wrote: Может, проблема как-то с этим связана?
Нет, у меня и это работает правильно.
Может быть лучше, чем гадать, показать ваш код?

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

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

Post by Skirda » Mon 09 Nov, 2015 10:17

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: 7979
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 66 times
Been thanked: 97 times

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

Post by HaRT » Mon 09 Nov, 2015 12:58

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: 5040
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

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

Post by Shmuel » Mon 09 Nov, 2015 13:06

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

Добавлено:
Поведение, описываемое автором (вывод числа вместо "Hello"), можно получить, если вместо FMVT_STRING указать FMVT_INTEGER.

stasf
Posts: 111
Joined: Wed 10 Dec, 2014 22:53
Has thanked: 2 times
Been thanked: 1 time

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

Post by stasf » Tue 10 Nov, 2015 19:53

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: 5040
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

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

Post by Shmuel » Tue 10 Nov, 2015 20:21

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

stasf
Posts: 111
Joined: Wed 10 Dec, 2014 22:53
Has thanked: 2 times
Been thanked: 1 time

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

Post by stasf » Tue 10 Nov, 2015 20:36

Shmuel wrote:
Конструктор, тем не менее, в полном порядке.
А у меня к нему никаких претензий и нет.
Просто помучаться пришлось из-за неочевидного эффекта...
Сам виноват - поленился plugin.hpp почитать :-)
В любом случае, СПАСИБО !

User avatar
DrKnS
Posts: 4533
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

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

Post by DrKnS » Tue 10 Nov, 2015 20:54

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

Shmuel
Posts: 5040
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 133 times

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

Post by Shmuel » Tue 10 Nov, 2015 20:57

DrKnS wrote: Зачем выдавать предупреждения на полностью корректный код?
Не являюсь спецом по C++, но, думаю, не зря VS выдаёт ошибку.

User avatar
DrKnS
Posts: 4533
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

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

Post by DrKnS » Tue 10 Nov, 2015 21:10

Это uniform initialisation syntax, C++11.
VS2010 по понятным причинам C++11 умеет очень частично.

Post Reply

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

Who is online

Users browsing this forum: No registered users and 3 guests