Scripts plugin

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

Post by Fr0sT »

FeyFre
хмм, да, разбираться долговато. А какой вообще принцип, если на пальцах?
В принципе, именно оконную процедуру привязать - проблем никаких, а вот произвольный callback - даже не знаю, как это можно сотворить. Разве что сделать заглушку, в которой на асме разбирать стек в соответствии с указанным ранее набором параметров и вызывать подходящую функцию...

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

Post by FeyFre »

В принципе, именно оконную процедуру привязать - проблем никаких, а вот произвольный callback - даже не знаю, как это можно сотворить. Разве что сделать заглушку, в которой на асме разбирать стек в соответствии с указанным ранее набором параметров и вызывать подходящую функцию...
Ну вот там приблизительно так и делают при создании callback:
1. Создаю заглушку на асме
2. При каждом создании callback выделяют кусок памяти с атрибутами выполнения.
3. Копируют туда заглшку.
4. В памяти в placeholder-ы заносят реальные адреса функций и инормацию о парметрах и скриптовом callback(контекст)
5. Адрес этой памяти дают куда просят.

Реально заглушка там простая - вызов опреденной С-функции с указателем на контекс которые выставили при создании.
С-функция с контекста достает инфу о параметра/возвращаемом значении и вызываемой скриптовой функции и соответвенно достаёт их со стека(стека параметров заглушки, а не своего), маршалит и вызывает скрипт.

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

Post by Fr0sT »

Ага, ясненько. Да, было бы неплохо такую штуку в Scripts засунуть :)

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Fr0sT wrote:было бы неплохо такую штуку в Scripts засунуть :)
А что оно в результате даст? Чем оно лучше, чем сейчас?

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

Post by FeyFre »

VladSh
Не нужно будет городить огороды что-бы создавать окна и диалоги(как видишь, диалоги сейчас и с огородами не создаются).
Я в хотелке написал что оно даст.

Я бы был не против, если бы был бы прикручен IUP к плагину, но он сам весит огого, да и опять таки этот же костыль нужен для взаиодействия со скриптом(ибо биндингов на JS нету)

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Новая версия плагина (Scripts.dll: версия 6.7, 48 128 байт, MD5: 9a349502e167c279730402a8a58ec979) роняет AkelPad при вызове любого скрипта.
Windows 7, 32-битная.

Версия из предыдущего PlugsPack.zip работает нормально (Scripts.dll: версия 6.6, 49 152 байт, MD5: 8030d911a386ba670b78949f9a0b65d2).

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

Post by Instructor »

Infocatcher
Туда попала версия, с которой проводились эксперименты :) Поправил.

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

Post by FeyFre »

Instructor
Вопрос на засыпку:

Code: Select all

var data = AkelPad.MemRead(memoory, 5/*DT_BYTE*/);
Читает знаковые данные или без знаковые? Собственно по остальным(DT_WORD, DT_DWORD) тот же вопрос.

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

Post by Instructor »

FeyFre
Это как понимать? :)

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

Post by FeyFre »

Instructor
Это понимать, так:
В памяти лежит байт с HEX кодом 0xFF
После кода

Code: Select all

var number = AkelPad.MemRead(memory, 5/*DT_BYTE*/);
В number что будет лежать: -1 или 255 ?

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

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

Code: Select all

if (nValue < 0) nValue+=0xFF + 1;

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

Post by FeyFre »

****
Пока писал в чём проблема, осенило что проблема в голове/кривых руках.(допиливаю zen coding)
****
А может лучше сделать DT_BYTE/DT_WORD/DT_DWORD беззнаковыми, и добавить знаковые варианты?
И значения этих констант зашить по аналогии с _TSTR, _TCHAR, _TSIZE ? А то каждый раз приходится лазить к доки что-бы вспомнить что использовать.

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

Post by Fr0sT »

Вообще Word и DWord всю жизнь были unsigned, от того, что они вдруг стали signed, настает когнитивный диссонанс %)

Offline
Posts: 267
Joined: Mon Mar 12, 2007 3:45 pm

Post by [Yustas.NeO] »

se7h wrote:разве есть моменты, когда без них не обойтись?
Есть. Например, при включенной галочке "Сохранять при потере фокуса" в разделе AutoSave SaveFile-плагина... Вот если бы в AutoSave была соответствующая проверка - тогда я тоже за немодальность всех окон! А то сейчас очень раздражает, когда вызываешь окно Macros, и происходит массовое пересохранение всех открытых вкладок!...

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

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