ProcessConsoleInput
-
- Posts: 3651
- Joined: Wed 23 Nov, 2005 11:11
- Location: Москва-Питер
- Has thanked: 2 times
- Been thanked: 19 times
ProcessConsoleInput
Некоторое количество плагинов используют технологию хака таблицы импорта, для перехвата функций ReadConsoleInput/WriteConsoleOutput. Это в целом работает, но есть неприятный эффект. Если такой перехват сделали 2 или более плагина то корректно выгрузить их можно только в порядке обратном загрузке, иначе выгружаемый плагин снесет все позже установленные обработчики. Или не снесет, но тогда еще хуже - все свалится.
Может "легализовать" эту технологию, раз уж она востребована? Предлагаю добавить в API: если плагин экспортирует специальную функцию (например: ProcessConsoleInput), то FAR вызывает их по очереди для каждого плагина, до того как обработает событие сам. Плагин должен иметь возможность сказать, что он обработал сообщение и его нужно "погасить".
Для ProcessConsoleOutput - аналогично
Может "легализовать" эту технологию, раз уж она востребована? Предлагаю добавить в API: если плагин экспортирует специальную функцию (например: ProcessConsoleInput), то FAR вызывает их по очереди для каждого плагина, до того как обработает событие сам. Плагин должен иметь возможность сказать, что он обработал сообщение и его нужно "погасить".
Для ProcessConsoleOutput - аналогично
-
- Posts: 3651
- Joined: Wed 23 Nov, 2005 11:11
- Location: Москва-Питер
- Has thanked: 2 times
- Been thanked: 19 times
Re: ProcessConsoleInput
Есть несколько вопросов, которые требуют обсуждения.
1. Нужен перехват только ReadConsoleInput или PeekConsoleInput тоже? Я в MacroLib обошелся одним ReadConsoleInput, но может есть сценарии где потребуется Peek...
2. Прототип функции (извините, что на Pascal):
Т.е. совпадает с ReadConsoleInput, с добавлением AFlags. Зачем нужны флаги? На всякий случай. Возможные значения для AFlags:
- Признак Read/Peek, если будет решено что Peek тоже нужен.
- Откуда вызывается функция(?). Тут я не до конца уверен, но есть проблемка в MacroLib'е, что он не может различить, когда ReadConsoleInput вызывается FAR'ом из основного цикла обработки сообщений(?), либо плагином для обработки прерывания. Может ее удастся разрулить флагами.
- Еще что-то...
3. Если плагин вернул False, то обработка сообщения продолжается (другими плагинами, а потом - самим FAR), если плагин вернул True - то он обработал сообщение сам и его обработку нужно прекратить.
Как то так. Высказывайте замечания.
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;
- Признак Read/Peek, если будет решено что Peek тоже нужен.
- Откуда вызывается функция(?). Тут я не до конца уверен, но есть проблемка в MacroLib'е, что он не может различить, когда ReadConsoleInput вызывается FAR'ом из основного цикла обработки сообщений(?), либо плагином для обработки прерывания. Может ее удастся разрулить флагами.
- Еще что-то...
3. Если плагин вернул False, то обработка сообщения продолжается (другими плагинами, а потом - самим FAR), если плагин вернул True - то он обработал сообщение сам и его обработку нужно прекратить.
Как то так. Высказывайте замечания.
Re: ProcessConsoleInput
Плагин должен регистрироваться, IMHO...
We are the Borg. You will be assimilated.
So Say We All!
So Say We All!
-
- Posts: 3651
- Joined: Wed 23 Nov, 2005 11:11
- Location: Москва-Питер
- Has thanked: 2 times
- Been thanked: 19 times
Re: ProcessConsoleInput
Зачем? Наличия экспорта - не достаточно? ProcessEditor/Viewer/Dialog - никак специально не регистрируются.Skirda wrote:Плагин должен регистрироваться, IMHO...
Re: ProcessConsoleInput
а, экспорт... ну да.
We are the Borg. You will be assimilated.
So Say We All!
So Say We All!
Re: ProcessConsoleInput
ФАР юзает PeekConsoleInput, ReadConsoleInput, WriteConsoleInput.
Ты предлагаешь их всех?
А вдруг кто-то захочет *ConsoleOutput?
Ты предлагаешь их всех?
А вдруг кто-то захочет *ConsoleOutput?
We are the Borg. You will be assimilated.
So Say We All!
So Say We All!
-
- Posts: 3651
- Joined: Wed 23 Nov, 2005 11:11
- Location: Москва-Питер
- Has thanked: 2 times
- Been thanked: 19 times
Re: ProcessConsoleInput
Я предлагаю: ReadConsoleInput и WriteConsoleOutput - обе эти функции уже перехватываются несколькими плагинами.
Насчет PeekConsoleInput - я не уверен, поэтому и спрашиваю здесь, чтобы услышать мнение заинтересованных.
WriteConsoleInput - думаю, не надо. Это вообще экзотика.
Насчет PeekConsoleInput - я не уверен, поэтому и спрашиваю здесь, чтобы услышать мнение заинтересованных.
WriteConsoleInput - думаю, не надо. Это вообще экзотика.
-
- Posts: 3651
- Joined: Wed 23 Nov, 2005 11:11
- Location: Москва-Питер
- Has thanked: 2 times
- Been thanked: 19 times
Re: ProcessConsoleInput
По поводу прототипа для ReadConsoleInput. Может его упростить до такого:
Code: Select all
function ProcessConsoleInputW(hInput :THandle; var AEvent: TInputRecord; AFlags :DWORD): BOOL; stdcall;
Re: ProcessConsoleInput
вроде бы, с PeekConsoleInput есть несколько "узких мест", где фар ожидает, что вызвав ReadConsoleInput он получит то же событие, что пришло в PeekConsoleInput. так что, по хорошему, нужно обрабатывать Peek и Read как одно целое.Max Rusov wrote:Насчет PeekConsoleInput - я не уверен, поэтому и спрашиваю здесь, чтобы услышать мнение заинтересованных.
-
- Posts: 3651
- Joined: Wed 23 Nov, 2005 11:11
- Location: Москва-Питер
- Has thanked: 2 times
- Been thanked: 19 times
Re: ProcessConsoleInput
Как я понимаю, Peek вызывается чтобы посмотреть - есть ли что в буфере, а Read - чтобы уже прочесть. Т.е. просто чтобы не "висеть" в Read'е. Если это так - то Peek вроде бы не нужно перехватывать. Если есть другие алгоритмы - то уже надо анализировать.
Upd.
Еще вопрос: надо ли разрешать плагину модифицировать структуру InputRecord? Или достаточно того, что он просто скажет: продолжить или прекратить ее дальнейшую обработку?...
Upd.
Еще вопрос: надо ли разрешать плагину модифицировать структуру InputRecord? Или достаточно того, что он просто скажет: продолжить или прекратить ее дальнейшую обработку?...
Re: ProcessConsoleInput
а зачем модифицировать?
пример
пример
We are the Borg. You will be assimilated.
So Say We All!
So Say We All!
-
- Posts: 3651
- Joined: Wed 23 Nov, 2005 11:11
- Location: Москва-Питер
- Has thanked: 2 times
- Been thanked: 19 times
Re: ProcessConsoleInput
Я не знаю, потому и спрашиваю. Мне - достаточно возможности "погасить" событие. Но, возможно, есть другие мнения.
Re: ProcessConsoleInput
Я так думаю, что у ProcessConsoleInputW первым параметром добавить тип действия - Peek, Read, Write
...дабы не выдумывать потом еще кучу экспортируемых функций
...дабы не выдумывать потом еще кучу экспортируемых функций
We are the Borg. You will be assimilated.
So Say We All!
So Say We All!
-
- Posts: 3651
- Joined: Wed 23 Nov, 2005 11:11
- Location: Москва-Питер
- Has thanked: 2 times
- Been thanked: 19 times
Re: ProcessConsoleInput
Не, 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;
Re: ProcessConsoleInput
а почему параметры раскрывать именно так?
лучше одна функция с двумя (4-мя на всякий случай?) параметрами - первый действие, второй - ссылка на соответствующую структуру.
ProcessConsoleInputW(как, что)
И, кстати, когда я говорил про Write, имел ввиду WriteConsoleInput, т.е. запись не "на экран", а в консольный буфер событий.
На экран писать (ударение по вкусу) негоже
лучше одна функция с двумя (4-мя на всякий случай?) параметрами - первый действие, второй - ссылка на соответствующую структуру.
ProcessConsoleInputW(как, что)
И, кстати, когда я говорил про Write, имел ввиду WriteConsoleInput, т.е. запись не "на экран", а в консольный буфер событий.
На экран писать (ударение по вкусу) негоже
We are the Borg. You will be assimilated.
So Say We All!
So Say We All!