ProcessConsoleInput

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

ProcessConsoleInput

Post by Max Rusov »

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

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

Для ProcessConsoleOutput - аналогично
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: ProcessConsoleInput

Post by Max Rusov »

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

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: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: ProcessConsoleInput

Post by Skirda »

Плагин должен регистрироваться, IMHO...
We are the Borg. You will be assimilated.
So Say We All!
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: ProcessConsoleInput

Post by Max Rusov »

Skirda wrote:Плагин должен регистрироваться, IMHO...
Зачем? Наличия экспорта - не достаточно? ProcessEditor/Viewer/Dialog - никак специально не регистрируются.
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: ProcessConsoleInput

Post by Skirda »

а, экспорт... ну да.
We are the Borg. You will be assimilated.
So Say We All!
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: ProcessConsoleInput

Post by Skirda »

ФАР юзает PeekConsoleInput, ReadConsoleInput, WriteConsoleInput.
Ты предлагаешь их всех?
А вдруг кто-то захочет *ConsoleOutput?
We are the Borg. You will be assimilated.
So Say We All!
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: ProcessConsoleInput

Post by Max Rusov »

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

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

WriteConsoleInput - думаю, не надо. Это вообще экзотика.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: ProcessConsoleInput

Post by Max Rusov »

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

Code: Select all

function ProcessConsoleInputW(hInput :THandle; var AEvent: TInputRecord; AFlags :DWORD): BOOL; stdcall;
Maximus5
Posts: 3295
Joined: Sun 11 Nov, 2007 02:03
Been thanked: 10 times
Contact:

Re: ProcessConsoleInput

Post by Maximus5 »

Max Rusov wrote:Насчет PeekConsoleInput - я не уверен, поэтому и спрашиваю здесь, чтобы услышать мнение заинтересованных.
вроде бы, с PeekConsoleInput есть несколько "узких мест", где фар ожидает, что вызвав ReadConsoleInput он получит то же событие, что пришло в PeekConsoleInput. так что, по хорошему, нужно обрабатывать Peek и Read как одно целое.
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: ProcessConsoleInput

Post by Max Rusov »

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

Upd.

Еще вопрос: надо ли разрешать плагину модифицировать структуру InputRecord? Или достаточно того, что он просто скажет: продолжить или прекратить ее дальнейшую обработку?...
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: ProcessConsoleInput

Post by Skirda »

а зачем модифицировать?
пример
We are the Borg. You will be assimilated.
So Say We All!
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: ProcessConsoleInput

Post by Max Rusov »

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

Re: ProcessConsoleInput

Post by Skirda »

Я так думаю, что у ProcessConsoleInputW первым параметром добавить тип действия - Peek, Read, Write
...дабы не выдумывать потом еще кучу экспортируемых функций ;-)
We are the Borg. You will be assimilated.
So Say We All!
Max Rusov
Posts: 3651
Joined: Wed 23 Nov, 2005 11:11
Location: Москва-Питер
Has thanked: 2 times
Been thanked: 19 times

Re: ProcessConsoleInput

Post by Max Rusov »

Не, 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: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: ProcessConsoleInput

Post by Skirda »

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

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

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