Page 23 of 74
Posted: Fri Aug 13, 2010 10:00 am
by Fr0sT
FeyFre
хмм, да, разбираться долговато. А какой вообще принцип, если на пальцах?
В принципе, именно оконную процедуру привязать - проблем никаких, а вот произвольный callback - даже не знаю, как это можно сотворить. Разве что сделать заглушку, в которой на асме разбирать стек в соответствии с указанным ранее набором параметров и вызывать подходящую функцию...
Posted: Fri Aug 13, 2010 11:07 am
by FeyFre
В принципе, именно оконную процедуру привязать - проблем никаких, а вот произвольный callback - даже не знаю, как это можно сотворить. Разве что сделать заглушку, в которой на асме разбирать стек в соответствии с указанным ранее набором параметров и вызывать подходящую функцию...
Ну вот там приблизительно так и делают при создании callback:
1. Создаю заглушку на асме
2. При каждом создании callback выделяют кусок памяти с атрибутами выполнения.
3. Копируют туда заглшку.
4. В памяти в placeholder-ы заносят реальные адреса функций и инормацию о парметрах и скриптовом callback(контекст)
5. Адрес этой памяти дают куда просят.
Реально заглушка там простая - вызов опреденной С-функции с указателем на контекс которые выставили при создании.
С-функция с контекста достает инфу о параметра/возвращаемом значении и вызываемой скриптовой функции и соответвенно достаёт их со стека(стека параметров заглушки, а не своего), маршалит и вызывает скрипт.
Posted: Fri Aug 13, 2010 1:47 pm
by Fr0sT
Ага, ясненько. Да, было бы неплохо такую штуку в Scripts засунуть

Posted: Fri Aug 13, 2010 2:02 pm
by VladSh
Fr0sT wrote:было бы неплохо такую штуку в Scripts засунуть

А что оно в результате даст? Чем оно лучше, чем сейчас?
Posted: Fri Aug 13, 2010 3:09 pm
by FeyFre
VladSh
Не нужно будет городить огороды что-бы создавать окна и диалоги(как видишь, диалоги сейчас и с огородами не создаются).
Я в хотелке написал что оно даст.
Я бы был не против, если бы был бы прикручен IUP к плагину, но он сам весит огого, да и опять таки этот же костыль нужен для взаиодействия со скриптом(ибо биндингов на JS нету)
Posted: Tue Aug 17, 2010 5:03 pm
by Infocatcher
Новая версия плагина (Scripts.dll: версия 6.7, 48 128 байт, MD5: 9a349502e167c279730402a8a58ec979) роняет AkelPad при вызове любого скрипта.
Windows 7, 32-битная.
Версия из предыдущего PlugsPack.zip работает нормально (Scripts.dll: версия 6.6, 49 152 байт, MD5: 8030d911a386ba670b78949f9a0b65d2).
Posted: Tue Aug 17, 2010 6:03 pm
by Instructor
Infocatcher
Туда попала версия, с которой проводились эксперименты

Поправил.
Posted: Wed Sep 15, 2010 8:33 am
by FeyFre
Instructor
Вопрос на засыпку:
Code: Select all
var data = AkelPad.MemRead(memoory, 5/*DT_BYTE*/);
Читает знаковые данные или без знаковые? Собственно по остальным(DT_WORD, DT_DWORD) тот же вопрос.
Posted: Wed Sep 15, 2010 1:22 pm
by Instructor
FeyFre
Это как понимать?

Posted: Wed Sep 15, 2010 3:04 pm
by FeyFre
Instructor
Это понимать, так:
В памяти лежит байт с HEX кодом 0xFF
После кода
Code: Select all
var number = AkelPad.MemRead(memory, 5/*DT_BYTE*/);
В number что будет лежать: -1 или 255 ?
Posted: Wed Sep 15, 2010 3:28 pm
by Instructor
Код из Document_MemRead:
Code: Select all
else if (dwType == DT_DWORD)
{
vpData->vt=VT_I4;
vpData->lVal=*(DWORD *)nPointer;
}
else if (dwType == DT_WORD)
{
vpData->vt=VT_I2;
vpData->iVal=LOWORD(*(DWORD *)nPointer);
}
else if (dwType == DT_BYTE)
{
vpData->vt=VT_UI1;
vpData->bVal=LOBYTE(*(DWORD *)nPointer);
}
Только DT_BYTE unsigned, остальные signed. Если какие-то сложности возникают с типами, то вручную можно преобразовать:
Для DWORD:
Code: Select all
if (nValue < 0) nValue+=0xFFFFFFFF + 1;
Для WORD:
Code: Select all
if (nValue < 0) nValue+=0xFFFF + 1;
Для BYTE:
Posted: Wed Sep 15, 2010 3:48 pm
by FeyFre
****
Пока писал в чём проблема, осенило что проблема в голове/кривых руках.(допиливаю zen coding)
****
А может лучше сделать DT_BYTE/DT_WORD/DT_DWORD беззнаковыми, и добавить знаковые варианты?
И значения этих констант зашить по аналогии с _TSTR, _TCHAR, _TSIZE ? А то каждый раз приходится лазить к доки что-бы вспомнить что использовать.
Posted: Thu Sep 16, 2010 8:14 am
by Fr0sT
Вообще Word и DWord всю жизнь были unsigned, от того, что они вдруг стали signed, настает когнитивный диссонанс %)
Posted: Thu Sep 16, 2010 12:13 pm
by [Yustas.NeO]
se7h wrote:разве есть моменты, когда без них не обойтись?
Есть. Например, при включенной галочке "Сохранять при потере фокуса" в разделе AutoSave SaveFile-плагина... Вот если бы в AutoSave была соответствующая проверка - тогда я тоже за немодальность всех окон! А то сейчас очень раздражает, когда вызываешь окно Macros, и происходит массовое пересохранение всех открытых вкладок!...
Posted: Thu Oct 28, 2010 4:56 am
by Instructor
Изменено: теперь не используется libc.lib при компиляции.
Добавлено: методы MemStrPtr, WindowSubClass, WindowUnsubClass, ThreadHook, ThreadUnhook, SystemFunction().RegisterCallback, SystemFunction().UnregisterCallback.
Добавлено: возможность передавать в SystemFunction().Call строки напрямую в качестве констант.
Добавлено: необязательный параметр для GetAkelDir() позволяющий получить различные подпапки AkelPad'а.
Исправлено: некорректный переход к строке при ошибке в скрипте, если использовался перенос по словам.
Changed: libc.lib is no longer used when compiling.
Added: methods MemStrPtr, WindowSubClass, WindowUnsubClass, ThreadHook, ThreadUnhook, SystemFunction().RegisterCallback, SystemFunction().UnregisterCallback.
Added: possibility to pass in SystemFunction().Call strings directly as constants.
Added: optional parameter for GetAkelDir() that allows to obtain various AkelPad subfolders.
Fixed: incorrect movement to a error in the script, if word wrap used.
Scripts plugin v7.0