Переименовать callplugin

Здесь обсуждается всё, что касается макросов.
Maximus5
Posts: 3295
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 10 times
Contact:

Re: Переименовать callplugin

Post by Maximus5 »

Latest post of the previous page:

Skirda wrote:"VMStack.Push(Ret);" невовремя - отсюда рушится стек.
Его нужно ставить в "else" после "if (Work.Executing == MACROMODE_NOMACRO)".
Невовремя... хм, ну тебе виднее, конечно. У меня была такая мысль, что этот "VMStack.Push(Ret);" как раз и должен положить в стек результат выполнения. Типа "%r=plugin.call(foo); $if (%r) bla-bla-bla $end".
Для этого CallPluginItem и была разделена на два вызова. Иначе фиг проверишь, что такой плагин/пункт есть и был (в реале - будет) вызван.
А если Push(Ret) поставить в конец - толку от него уже не будет никакого.
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: Переименовать callplugin

Post by Skirda »

Maximus5 wrote:...
А если Push(Ret) поставить в конец - толку от него уже не будет никакого.
патч в архиве глянь.
We are the Borg. You will be assimilated.
So Say We All!
Maximus5
Posts: 3295
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 10 times
Contact:

Re: Переименовать callplugin

Post by Maximus5 »

Так уже глянул и синхронизоровал.
В смысле, что если убрать PushState - Push(Ret) делать можно?
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: Переименовать callplugin

Post by Skirda »

Push(Ret) всегда нужно делать (ну почти всегда) - мы же функцию вызываем, а у нее (у функций) всегда один сценарий:
0. Pop`аем число - количество параметров в стеке
1. Pop`аем параметры
2. что-то делаем
3. пушим результат
т.е. на выходе функции всегда в стеке есть значение, которое она туда поместила.

Вот смотри.
Последовательность:

Code: Select all

plugin.Call("D2F36B62-A470-418D-83A3-ED7A3710E5B5","45453CAC-499D-4B37-82B8-0A77F7BD087C") 5
компилится в

Code: Select all

00000000: MCODE_OP_PUSHSTR                        
00000001:   "D2F36B62-A470-418D-83A3-ED7A3710E5B5"
00000014: MCODE_OP_PUSHSTR                        
00000015:   "45453CAC-499D-4B37-82B8-0A77F7BD087C"
00000028: MCODE_OP_PUSHINT                        
00000029:   2                                     
0000002B: MCODE_F_PLUGIN_CALL
0000002C: MCODE_OP_SAVE
0000002D:   %                                     
0000002E: MCODE_OP_KEYS                           
0000002F: Key: '5'                                
00000030: MCODE_OP_ENDKEYS                        
В 0x2c MCODE_OP_SAVE Pop`нет из стека то, что должен был пропушить MCODE_F_PLUGIN_CALL.
Если мы не сделаем Push(Ret) - стек улетит в трубу.

По поводу "ну почти всегда" (это касается только функций, семейства plugin.call и callplugin)
Здесь нужно пушить до вызова плагина, иначе наш Push... снова сорвет стек (последовательность то продолжается - в примере 0x2c)

Почему я убрал PushState?
Plugin.Call это замена F11, так? Я так думаю, что здесь нужно ввести ограничение - чтобы плагин не кидались макросами в середине исполнения... иначе получаем еще тот гимор (хотя, могу быть не прав). В принципе они могут запулить макрос, но в этом случае он станет в конец очереди.
We are the Borg. You will be assimilated.
So Say We All!
Maximus5
Posts: 3295
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 10 times
Contact:

Re: Переименовать callplugin

Post by Maximus5 »

согласен
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: Переименовать callplugin

Post by Skirda »

Maximus5 wrote:Кроме того, если после этого еще раз нажать AltShiftF7, в в текст вставляется "5" вместо отображения Outliner'а.
Нашел... Это "Work.KeyProcess" "не согласован" был :-)

Еще тест или фиксируем изменения?
We are the Borg. You will be assimilated.
So Say We All!
Maximus5
Posts: 3295
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 10 times
Contact:

Re: Переименовать callplugin

Post by Maximus5 »

О как )
а я после последнего патча глюков еще не видел.
Фиксируй, наверное. пора)
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: Переименовать callplugin

Post by NightRoman »

Вопрос по добавленным функциям, извините, если пропустил это в обсуждении, не успеваю за всем.

В новых функциях разве первый параметр не избыточный? Поскольку у меня плагин - комбайн (Фарнет), то всегда придется указывать 2 параметра. Надо, так надо, нет проблем. Но вопрос об избыточности возникает. По идее второй параметр сам по себе уже уникально все определяет (ну разве что за исключением вызова по префиксу), тогда зачем первый применять?

С вызовом по префиксу вопрос. В команде префикс нужно указывать? Если нужно, то и тут уникальность вызова в принципе обеспечена вторым параметром.

(а вообще - молодцы, верной дорогой идете, товарищи!)
User avatar
ShadowNev
Posts: 86
Joined: Fri 06 Feb, 2009 12:54
Has thanked: 1 time

Re: Переименовать callplugin

Post by ShadowNev »

что-то я так и непонял как узнать MenuGuid ???
Только глупцы могут быть непоколебимы в своей уверенности. (c) Монтень.
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: Переименовать callplugin

Post by NightRoman »

ShadowNev wrote:что-то я так и непонял как узнать MenuGuid ???
F3 в меню плагинов на нужном пункте?
User avatar
ShadowNev
Posts: 86
Joined: Fri 06 Feb, 2009 12:54
Has thanked: 1 time

Re: Переименовать callplugin

Post by ShadowNev »

NightRoman wrote:
ShadowNev wrote:что-то я так и непонял как узнать MenuGuid ???
F3 в меню плагинов на нужном пункте?
хмм мой косяк
PlugMenu выводит без Plugin Item GUID
сорри
Только глупцы могут быть непоколебимы в своей уверенности. (c) Монтень.
Maximus5
Posts: 3295
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 10 times
Contact:

Re: Переименовать callplugin

Post by Maximus5 »

На счет избыточности.
Фигу. Первый параметр обязательный. Нет никакой гарантии, что в качестве MenuGuid плагин использует действительно уникальные гуиды. А вот за первым - фар следит.

По префиксу - попробуй, узнаешь, нам расскажешь.
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: Переименовать callplugin

Post by NightRoman »

Maximus5 wrote:Нет никакой гарантии, что в качестве MenuGuid плагин использует действительно уникальные гуиды.
ОК. И как он собирается работать, если у него в меню в одной области два пункта с одинаковыми гуидами? Не, все-таки подумайте, не перемудрили ли.
Maximus5 wrote:По префиксу - попробуй, узнаешь, нам расскажешь.
Если это единственный способ узнать о новостях в АПИ, то придется, конечно.
Maximus5
Posts: 3295
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 10 times
Contact:

Re: Переименовать callplugin

Post by Maximus5 »

Не мути воду. Вопрос хотя бы в производительности, если другие доводы для тебя не важны :)
Как ты сам можешь догадаться, получить список MenuGuid плагина можно только дернув GetPluginInfoW. А я все-таки подозреваю, что даже у тебя в списке установленных плагинов не только FarNet.
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: Переименовать callplugin

Post by NightRoman »

Не мути сам. Речь об удобном АПИ, которое делается на годы. Если есть возможность обойтись одним параметром, то почему об этом не подумать. Производительность? Пройтись по списку гуидов меню в области? Это такой пустяк, что даже думать не надо. Удобство АПИ на первом месте тут.
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: Переименовать callplugin

Post by NightRoman »

Как ты сам можешь догадаться, получить список MenuGuid плагина можно только дернув GetPluginInfoW
Плагины же не все грузятся сразу. Есть закешированные данные. То есть не "только дернув GetPluginInfoW".
Locked

Return to “Обсуждение макросов”