Page 3 of 3
Posted: Wed Oct 31, 2012 11:49 am
by Fr0sT
О_О Кошмар... какова же скорость работы этого монстра. В любом случае, JS нам тут не особо поможет
Posted: Wed Oct 31, 2012 2:28 pm
by Instructor
Fr0sT wrote:Более сложный - это сменить принцип постановки версий для API, либо меняя его только в случае возможной несовместимости, либо различая минорный-мажорный инкремент.
x1.x2.x3.x4
Версия архитектуры является становится несовместимой, если изменились x1 или x2.
Posted: Thu Nov 01, 2012 6:33 am
by Fr0sT
Instructor, здорово, респект! Значит, вопрос снимается
Posted: Mon Apr 08, 2013 1:39 pm
by Fr0sT
Как прекратить обработку сообщения WM_KEYUP/DOWN, если оно уже обработано в собственной процедуре, подставленной в цепь обработки через AKD_SETEDITPROC? Пробовал возвращать и LRESULT(True), и 0, и не вызывать NextProc - всё равно пропускается.
Код кратко:
Code: Select all
...
pwpd := nil;
SendMessage(AkelData.hMainWnd, AKD_SETEDITPROC, WPARAM(@SubclProc), LPARAM(@pwpd));
...
function SubclProc(hWnd: HWND; uMsg: UINT; wPar: WPARAM; lPar: LPARAM): LRESULT; stdcall;
var
Processed: Boolean;
begin
Processed := False;
case uMsg of
WM_KEYDOWN, WM_SYSKEYDOWN:
Processed := True;
WM_KEYUP, WM_SYSKEYUP:
Processed := True;
end; // case uMsg
if Processed then Exit(LRESULT(True)); <== добавил по аналогии с сорсом SmartSel
if (not Processed) and ((pwpd <> nil) and Assigned(pwpd.NextProc)) then
Result := pwpd.NextProc(hWnd, uMsg, wPar, lPar)
else
Result := 0;
end;
Posted: Wed Apr 10, 2013 4:22 pm
by Instructor
Fr0sT wrote:... и не вызывать NextProc - всё равно пропускается.
Достаточно не вызывать NextProc, дальше по цепи сообщение не пойдет. Откуда появилось заключение, что сообщение идет дальше?
Posted: Thu Apr 11, 2013 6:19 am
by Fr0sT
Instructor
Откуда появилось заключение, что сообщение идет дальше?
Так нажатый символ печатается, несмотря на то, что он плагином перехвачен.
В принципе, уже не актуально - сгоряча думал наваять плагин для ввода через альт, а потом оказалось, что все уже есть

Posted: Fri Apr 19, 2013 10:20 am
by Fr0sT
Instructor
в нескольких последних версиях странная вещь творится.
Плагин с одной резидентной функцией (автозапуск, UD_NONUNLOAD_ACTIVE) и функциями по требованию. Сценарий следующий:
1) Запускаем Акель, резидентная ф-я загружается
2) Вызываем ф-ю по требованию
3) Ф-я завершается
4) DLLMain плагина вызывается с параметром DLL_PROCESS_DETACH, производится очистка переменных, снятие хуков и прочее. Но резидентная-то функция должна быть до сих пор активна, и оставаться таковой до закрытия Акеля!
Судя по Log плагину, проблема решается сабклассингом главной процедуры и ловлей AKDN_MAIN_ONFINISH. Это правильный путь?
upd Попробовал снимать сабкласс в AKDN_MAIN_ONFINISH - вообще страшные вещи стали стали происходить.
Posted: Fri Apr 19, 2013 11:33 am
by FeyFre
3) Ф-я завершается
4) DLLMain плагина вызывается с параметром DLL_PROCESS_DETACH,
У Вас проблема в пункте 3. Если Вы хотите что-бы после завершения функции по-требованию резидент(весь плагин) оставался Вы должны вернуть UD_NONUNLOAD_NOTACTIVE. А Вы вероятно возвращаете UD_UNLOAD, при котором АР послушно(не смотря что другие функции активны) выгружает из памяти Ваш плагин(и Вы получаете DLL_PROCESS_DETACH). Т.е. Вы внутри плагина должны следить за состоянием и решать что возворащатть UD_UNLOAD или UD_NONUNLOAD_NONACTIVE. Это и будет решением проблемы. (Я так у себя в SpellCheck делаю: резидентом выставляю флажок активности функции(по факту там переменная рабочая на не NULL проверяется), а функции по требованию смотрят на него и корректируют UD_*.)
Вообще DLL_PROCESS_DETACH это последний шанс DLL-ке/плагину почистить за собой хвосты, тв т.ч. удостоверится что больше никто не знает указателей на память в которую загружена DLL и не будет пытаться туда писать/читать, передавать управление.
AKDN_MAIN_ONFINISH - да, этот хук нужно ловить что-бы отключить плагин корректно при выключении АР. Я так делаю в Templates.
Posted: Fri Apr 19, 2013 2:48 pm
by Fr0sT
Ааа, вот оно что! Попробуем. Странно, что раньше работало.
А где ман по plugin api?
Posted: Sat Apr 30, 2016 8:20 pm
by rst256
А где собственно ман по plugin api? Он существует?
Как хотя бы получить Н-ный аргумент при вызове некоего метода плагина в виде строки?