Вопросы по AkelPad Plugin API.

Discuss and announce AkelPad plugins
  • Author
  • Message
Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

О_О Кошмар... какова же скорость работы этого монстра. В любом случае, JS нам тут не особо поможет

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Fr0sT wrote:Более сложный - это сменить принцип постановки версий для API, либо меняя его только в случае возможной несовместимости, либо различая минорный-мажорный инкремент.
x1.x2.x3.x4
Версия архитектуры является становится несовместимой, если изменились x1 или x2.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

Instructor, здорово, респект! Значит, вопрос снимается

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post 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;


Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Fr0sT wrote:... и не вызывать NextProc - всё равно пропускается.
Достаточно не вызывать NextProc, дальше по цепи сообщение не пойдет. Откуда появилось заключение, что сообщение идет дальше?

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

Instructor
Откуда появилось заключение, что сообщение идет дальше?
Так нажатый символ печатается, несмотря на то, что он плагином перехвачен.
В принципе, уже не актуально - сгоряча думал наваять плагин для ввода через альт, а потом оказалось, что все уже есть :)

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

Instructor
в нескольких последних версиях странная вещь творится.
Плагин с одной резидентной функцией (автозапуск, UD_NONUNLOAD_ACTIVE) и функциями по требованию. Сценарий следующий:
1) Запускаем Акель, резидентная ф-я загружается
2) Вызываем ф-ю по требованию
3) Ф-я завершается
4) DLLMain плагина вызывается с параметром DLL_PROCESS_DETACH, производится очистка переменных, снятие хуков и прочее. Но резидентная-то функция должна быть до сих пор активна, и оставаться таковой до закрытия Акеля!

Судя по Log плагину, проблема решается сабклассингом главной процедуры и ловлей AKDN_MAIN_ONFINISH. Это правильный путь?

upd Попробовал снимать сабкласс в AKDN_MAIN_ONFINISH - вообще страшные вещи стали стали происходить.

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post 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.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

Ааа, вот оно что! Попробуем. Странно, что раньше работало.

Offline
Posts: 3
Joined: Sat Dec 06, 2014 9:16 am

А где ман по plugin api?

Post by rst256 »

А где собственно ман по plugin api? Он существует?
Как хотя бы получить Н-ный аргумент при вызове некоего метода плагина в виде строки?
Post Reply