| View previous topic :: View next topic |
| Author |
Message |
Fr0sT
Joined: 24 Jul 2007 Posts: 850
|
Posted: Wed Oct 31, 2012 11:49 am Post subject: |
|
|
| О_О Кошмар... какова же скорость работы этого монстра. В любом случае, JS нам тут не особо поможет |
|
| Back to top |
|
 |
Instructor Site Admin
Joined: 06 Jul 2006 Posts: 4640
|
Posted: Wed Oct 31, 2012 2:28 pm Post subject: |
|
|
| Fr0sT wrote: | | Более сложный - это сменить принцип постановки версий для API, либо меняя его только в случае возможной несовместимости, либо различая минорный-мажорный инкремент. | x1.x2.x3.x4
Версия архитектуры является становится несовместимой, если изменились x1 или x2. |
|
| Back to top |
|
 |
Fr0sT
Joined: 24 Jul 2007 Posts: 850
|
Posted: Thu Nov 01, 2012 6:33 am Post subject: |
|
|
| Instructor, здорово, респект! Значит, вопрос снимается |
|
| Back to top |
|
 |
Fr0sT
Joined: 24 Jul 2007 Posts: 850
|
Posted: Mon Apr 08, 2013 1:39 pm Post subject: |
|
|
Как прекратить обработку сообщения WM_KEYUP/DOWN, если оно уже обработано в собственной процедуре, подставленной в цепь обработки через AKD_SETEDITPROC? Пробовал возвращать и LRESULT(True), и 0, и не вызывать NextProc - всё равно пропускается.
Код кратко:
| Code: |
...
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;
|
|
|
| Back to top |
|
 |
Instructor Site Admin
Joined: 06 Jul 2006 Posts: 4640
|
Posted: Wed Apr 10, 2013 4:22 pm Post subject: |
|
|
| Fr0sT wrote: | | ... и не вызывать NextProc - всё равно пропускается. | Достаточно не вызывать NextProc, дальше по цепи сообщение не пойдет. Откуда появилось заключение, что сообщение идет дальше? |
|
| Back to top |
|
 |
Fr0sT
Joined: 24 Jul 2007 Posts: 850
|
Posted: Thu Apr 11, 2013 6:19 am Post subject: |
|
|
Instructor
| Quote: | | Откуда появилось заключение, что сообщение идет дальше? |
Так нажатый символ печатается, несмотря на то, что он плагином перехвачен.
В принципе, уже не актуально - сгоряча думал наваять плагин для ввода через альт, а потом оказалось, что все уже есть  |
|
| Back to top |
|
 |
Fr0sT
Joined: 24 Jul 2007 Posts: 850
|
Posted: Fri Apr 19, 2013 10:20 am Post subject: |
|
|
Instructor
в нескольких последних версиях странная вещь творится.
Плагин с одной резидентной функцией (автозапуск, UD_NONUNLOAD_ACTIVE) и функциями по требованию. Сценарий следующий:
1) Запускаем Акель, резидентная ф-я загружается
2) Вызываем ф-ю по требованию
3) Ф-я завершается
4) DLLMain плагина вызывается с параметром DLL_PROCESS_DETACH, производится очистка переменных, снятие хуков и прочее. Но резидентная-то функция должна быть до сих пор активна, и оставаться таковой до закрытия Акеля!
Судя по Log плагину, проблема решается сабклассингом главной процедуры и ловлей AKDN_MAIN_ONFINISH. Это правильный путь?
upd Попробовал снимать сабкласс в AKDN_MAIN_ONFINISH - вообще страшные вещи стали стали происходить. |
|
| Back to top |
|
 |
FeyFre
Joined: 07 Aug 2007 Posts: 1888 Location: Vinnitsa, Ukraine
|
Posted: Fri Apr 19, 2013 11:33 am Post subject: |
|
|
| Quote: | 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. |
|
| Back to top |
|
 |
Fr0sT
Joined: 24 Jul 2007 Posts: 850
|
Posted: Fri Apr 19, 2013 2:48 pm Post subject: |
|
|
| Ааа, вот оно что! Попробуем. Странно, что раньше работало. |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|