ProcessConsoleInput

Место, где разработчики плагинов могут поделиться своим опытом.
Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 10 times

ProcessConsoleInput

Post by Max Rusov » Fri 14 Jan, 2011 00:30

Некоторое количество плагинов используют технологию хака таблицы импорта, для перехвата функций ReadConsoleInput/WriteConsoleOutput. Это в целом работает, но есть неприятный эффект. Если такой перехват сделали 2 или более плагина то корректно выгрузить их можно только в порядке обратном загрузке, иначе выгружаемый плагин снесет все позже установленные обработчики. Или не снесет, но тогда еще хуже - все свалится.

Может "легализовать" эту технологию, раз уж она востребована? Предлагаю добавить в API: если плагин экспортирует специальную функцию (например: ProcessConsoleInput), то FAR вызывает их по очереди для каждого плагина, до того как обработает событие сам. Плагин должен иметь возможность сказать, что он обработал сообщение и его нужно "погасить".

Для ProcessConsoleOutput - аналогично

Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 10 times

Re: ProcessConsoleInput

Post by Max Rusov » Tue 18 Jan, 2011 09:28

Есть несколько вопросов, которые требуют обсуждения.

1. Нужен перехват только ReadConsoleInput или PeekConsoleInput тоже? Я в MacroLib обошелся одним ReadConsoleInput, но может есть сценарии где потребуется Peek...

2. Прототип функции (извините, что на Pascal):

Code: Select all

 function ProcessConsoleInputW(hConsoleInput :THandle; var lpBuffer: TInputRecord;
    nLength :DWORD; var lpNumberOfEventsRead :DWORD; AFlags :DWORD): BOOL; stdcall;
Т.е. совпадает с ReadConsoleInput, с добавлением AFlags. Зачем нужны флаги? На всякий случай. Возможные значения для AFlags:

- Признак Read/Peek, если будет решено что Peek тоже нужен.
- Откуда вызывается функция(?). Тут я не до конца уверен, но есть проблемка в MacroLib'е, что он не может различить, когда ReadConsoleInput вызывается FAR'ом из основного цикла обработки сообщений(?), либо плагином для обработки прерывания. Может ее удастся разрулить флагами.
- Еще что-то...

3. Если плагин вернул False, то обработка сообщения продолжается (другими плагинами, а потом - самим FAR), если плагин вернул True - то он обработал сообщение сам и его обработку нужно прекратить.

Как то так. Высказывайте замечания.

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

Re: ProcessConsoleInput

Post by Skirda » Tue 18 Jan, 2011 10:59

Плагин должен регистрироваться, IMHO...
We are the Borg. You will be assimilated.
So Say We All!

Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 10 times

Re: ProcessConsoleInput

Post by Max Rusov » Tue 18 Jan, 2011 11:11

Skirda wrote:Плагин должен регистрироваться, IMHO...
Зачем? Наличия экспорта - не достаточно? ProcessEditor/Viewer/Dialog - никак специально не регистрируются.

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

Re: ProcessConsoleInput

Post by Skirda » Tue 18 Jan, 2011 11:14

а, экспорт... ну да.
We are the Borg. You will be assimilated.
So Say We All!

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

Re: ProcessConsoleInput

Post by Skirda » Wed 19 Jan, 2011 08:13

ФАР юзает PeekConsoleInput, ReadConsoleInput, WriteConsoleInput.
Ты предлагаешь их всех?
А вдруг кто-то захочет *ConsoleOutput?
We are the Borg. You will be assimilated.
So Say We All!

Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 10 times

Re: ProcessConsoleInput

Post by Max Rusov » Wed 19 Jan, 2011 08:22

Я предлагаю: ReadConsoleInput и WriteConsoleOutput - обе эти функции уже перехватываются несколькими плагинами.

Насчет PeekConsoleInput - я не уверен, поэтому и спрашиваю здесь, чтобы услышать мнение заинтересованных.

WriteConsoleInput - думаю, не надо. Это вообще экзотика.

Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 10 times

Re: ProcessConsoleInput

Post by Max Rusov » Wed 19 Jan, 2011 08:25

По поводу прототипа для ReadConsoleInput. Может его упростить до такого:

Code: Select all

function ProcessConsoleInputW(hInput :THandle; var AEvent: TInputRecord; AFlags :DWORD): BOOL; stdcall;

Maximus5
Posts: 3292
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 4 times
Contact:

Re: ProcessConsoleInput

Post by Maximus5 » Wed 19 Jan, 2011 08:31

Max Rusov wrote:Насчет PeekConsoleInput - я не уверен, поэтому и спрашиваю здесь, чтобы услышать мнение заинтересованных.
вроде бы, с PeekConsoleInput есть несколько "узких мест", где фар ожидает, что вызвав ReadConsoleInput он получит то же событие, что пришло в PeekConsoleInput. так что, по хорошему, нужно обрабатывать Peek и Read как одно целое.

Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 10 times

Re: ProcessConsoleInput

Post by Max Rusov » Wed 19 Jan, 2011 09:05

Как я понимаю, Peek вызывается чтобы посмотреть - есть ли что в буфере, а Read - чтобы уже прочесть. Т.е. просто чтобы не "висеть" в Read'е. Если это так - то Peek вроде бы не нужно перехватывать. Если есть другие алгоритмы - то уже надо анализировать.

Upd.

Еще вопрос: надо ли разрешать плагину модифицировать структуру InputRecord? Или достаточно того, что он просто скажет: продолжить или прекратить ее дальнейшую обработку?...

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

Re: ProcessConsoleInput

Post by Skirda » Wed 19 Jan, 2011 09:32

а зачем модифицировать?
пример
We are the Borg. You will be assimilated.
So Say We All!

Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 10 times

Re: ProcessConsoleInput

Post by Max Rusov » Wed 19 Jan, 2011 09:42

Я не знаю, потому и спрашиваю. Мне - достаточно возможности "погасить" событие. Но, возможно, есть другие мнения.

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

Re: ProcessConsoleInput

Post by Skirda » Mon 24 Jan, 2011 12:36

Я так думаю, что у ProcessConsoleInputW первым параметром добавить тип действия - Peek, Read, Write
...дабы не выдумывать потом еще кучу экспортируемых функций ;-)
We are the Borg. You will be assimilated.
So Say We All!

Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 10 times

Re: ProcessConsoleInput

Post by Max Rusov » Mon 24 Jan, 2011 12:47

Не, Read и Write совмещать не надо. У них прототипы существенно разные. Предлагаю все-таки 2 экспорта:

Code: Select all

function ProcessConsoleInputW(hInput :THandle; var AEvent: TInputRecord; AFlags :DWORD): BOOL; stdcall;

procedure ProcessConsoleOutputW(hOutput :THandle; Buffer :Pointer; BufSize :COORD; BufPos :COORD; WriteRect :PSmallRect); stdcall;

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

Re: ProcessConsoleInput

Post by Skirda » Mon 24 Jan, 2011 13:22

а почему параметры раскрывать именно так?
лучше одна функция с двумя (4-мя на всякий случай?) параметрами - первый действие, второй - ссылка на соответствующую структуру.
ProcessConsoleInputW(как, что)

И, кстати, когда я говорил про Write, имел ввиду WriteConsoleInput, т.е. запись не "на экран", а в консольный буфер событий.
На экран писать (ударение по вкусу) негоже :-)
We are the Borg. You will be assimilated.
So Say We All!

Max Rusov
Posts: 3632
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 1 time
Been thanked: 10 times

Re: ProcessConsoleInput

Post by Max Rusov » Mon 24 Jan, 2011 13:34

Skirda wrote:И, кстати, когда я говорил про Write, имел ввиду WriteConsoleInput
А, я не понял. Тогда ладно, мне все равно. Давайте уже сделаем как-нибудь :)
Skirda wrote:На экран писать негоже
ПисАть на экран - тоже востребованная задача. Screen Gadgets пишет. Я в PanelTabs тоже бы воспользовался - табы тогда моргали бы меньше...

Post Reply

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