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

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

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

Post by stasf »

Latest post of the previous page:

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

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

Post by Shmuel »

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 »

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

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

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

Post by Shmuel »

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 »

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: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 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: 111
Joined: Wed 10 Dec, 2014 22:53
Has thanked: 2 times
Been thanked: 1 time

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

Post by stasf »

В моем случае

Code: Select all

const wchar_t* sMacro = L"@c:\path_to\test";
Может, проблема как-то с этим связана?
Все остальное, кажется, у нас полностью аналогично...
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 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: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 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: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

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

Добавлено:
Поведение, описываемое автором (вывод числа вместо "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 »

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: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

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 »

Shmuel wrote:
Конструктор, тем не менее, в полном порядке.
А у меня к нему никаких претензий и нет.
Просто помучаться пришлось из-за неочевидного эффекта...
Сам виноват - поленился plugin.hpp почитать :-)
В любом случае, СПАСИБО !
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

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

Post by DrKnS »

Shmuel wrote:Visual Studio 10 такой код вообще не пропускает. Вы, видимо, собирали с GCC.GCC, на мой взгляд, мог бы хоть предупреждение выдать, это да.
Зачем выдавать предупреждения на полностью корректный код?
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

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

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