Log plugin

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

Post by Fr0sT »

Отличный рантайм, по мне. Есть куча всего. Меня устраивает, а кому не нравится - так ведь и не заставляют же. Пускай хоть на батч файлах пишет, там рантайм вообще нулевой )))

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

Post by Instructor »

Благодаря инициативности DV, рациональные предложения по изменению внешних вызов плагина, были реализованы :)

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

Post by Instructor »

Добавлено: параметр во внешний вызов с кодом 3, для получения состояния запуска приложения (Log::Output).
Добавлено: внешние вызовы с кодом 4 и 5 для установки/добавления текста в панель вывода (Log::Output).

Added: parameter in external call with code 3 to get execution state (Log::Output).
Added: external calls with code 4 and 5 to set/add text in the output panel (Log::Output).


Log plugin v1.9

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Что-то здесь не так...
Если у меня в Log::Output запущен cmd.exe, то как только я вызываю Call("Log::Output", 5, "* 123 *"), тут же пропадает поле ввода и кнопки Ввод и Стоп, лишая возможности набрать "exit" для завершения cmd.exe.
А Call("Log::Output", 3) иногда возвращает ненулевой PROCESSHANDLE, но нулевой PLUGINTHREAD.

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

Post by Instructor »

DV
Как ведет себя версия 2.0?

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Instructor wrote:Как ведет себя версия 2.0?
Первое (кнопки) починилось, второе (PLUGINTHREAD) - нет. Вот этот кусок мне не нравится:
if (IsExtCallParamValid(pd->lParam, 2))
lpdwExecState=(DWORD *)GetExtCallParam(pd->lParam, 2);
if (IsExtCallParamValid(pd->lParam, 3))
lphExecThread=(HANDLE *)GetExtCallParam(pd->lParam, 3);
if (IsExtCallParamValid(pd->lParam, 4))
lphExecThread=(HANDLE *)GetExtCallParam(pd->lParam, 4);
И похоже, что параметр APPEND в "Log::Output",5 игнорируется.
Кстати, а зачем разделение на "Log::Output",4 и "Log::Output",5 ?
Вот обновлённый проверочный скрипт для всего этого дела:

Code: Select all

Test3();

function Test1()
{
  var dwState = 0;
  var lpState = AkelPad.MemAlloc(4 /*sizeof(DWORD)*/);
  if (lpState)
  {
    AkelPad.Call("Log::Output", 3, lpState);
    dwState = AkelPad.MemRead(lpState, 3 /*DT_DWORD*/);
    AkelPad.MemFree(lpState);
    WScript.Echo(dwState);
  }
}

function Test2()
{
  AkelPad.Call("Log::Output", 5, "Hello!\n");
  
  var hChildProcess = 0;
  var lpChildProcess = AkelPad.MemAlloc(_X64 ? 8 : 4 /*sizeof(HANDLE)*/);
  if (lpChildProcess)
  {
    AkelPad.Call("Log::Output", 3, 0, 0, lpChildProcess);
    hChildProcess = AkelPad.MemRead(lpChildProcess, 2 /*DT_QWORD*/);
    AkelPad.MemFree(lpChildProcess);
    AkelPad.Call("Log::Output", 5, "hChildProcess = " + hChildProcess + "\n");
  }
}

function Test3()
{
  var prevState = -1;
  var dwState = 0;
  var lpState = 0;
  var hPluginThread = 0;
  var lpPluginThread = 0;
  var hChildProcess = 0;
  var lpChildProcess = 0;
  var s;
  
  lpState = AkelPad.MemAlloc(4 /*sizeof(DWORD)*/);
  lpPluginThread = AkelPad.MemAlloc(_X64 ? 8 : 4 /*sizeof(HANDLE)*/);
  lpChildProcess = AkelPad.MemAlloc(_X64 ? 8 : 4 /*sizeof(HANDLE)*/);
  
  if (lpState && lpPluginThread && lpChildProcess)
  {
    AkelPad.Call("Log::Output", 5, "*** Starting cmd.exe...\n", -1, 0);
    AkelPad.Call("Log::Output", 1, "cmd", "", "", "", -1, -1, 8);

    while (prevState != 0)
    {
      AkelPad.Call("Log::Output", 3, lpState, lpPluginThread, lpChildProcess);
      dwState = AkelPad.MemRead(lpState, 3 /*DT_DWORD*/);
      if (dwState != prevState)
      {
        if (dwState >= 4)
        {
          hPluginThread = AkelPad.MemRead(lpPluginThread, 2 /*DT_QWORD*/);
          hChildProcess = AkelPad.MemRead(lpChildProcess, 2 /*DT_QWORD*/);
          s = "*** The process " + hChildProcess + " has been created in thread " + hPluginThread + "\n";
          s = s + "*** Now please type "exit" to exit cmd.exe...\n";
        }
        else if (dwState >= 2)
        {
          hPluginThread = AkelPad.MemRead(lpPluginThread, 2 /*DT_QWORD*/);
          s = "*** The plugin thread has been created: " + hPluginThread + "\n";
        }
        else if (dwState >= 1)
        {
          s = "*** Preparing to execute the command...\n";
        }
        else if (dwState == 0 && prevState != -1)
        {
          s = "*** That's all, folks!\n";
        }

        if (dwState != 0 || prevState != -1)
        {
          AkelPad.Call("Log::Output", 5, s);
          prevState = dwState;
        }
      }
      else
      {
        WScript.Sleep(100);
      }
    }
    
    AkelPad.MemFree(lpChildProcess);
    AkelPad.MemFree(lpPluginThread);
    AkelPad.MemFree(lpState);
  }
}
Last edited by DV on Mon Mar 19, 2012 9:04 am, edited 1 time in total.

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

Post by Instructor »

DV
Теперь должно быть нормально.
Кстати, а зачем разделение на "Log::Output",4 и "Log::Output",5 ?
Для передачи Ansi строки на Unicode системе или наоборот.

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Instructor wrote:Теперь должно быть нормально.
Великолепно! Во всяком случае, проверочный скрипт работает именно так, как ожидается.

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Instructor wrote:
Кстати, а зачем разделение на "Log::Output",4 и "Log::Output",5 ?
Для передачи Ansi строки на Unicode системе или наоборот.
Т.е. получается, что для вывода строк из скрипта по сути нужно использовать что-то вроде

Code: Select all

AkelPad.Call("Log::Output", 4 + _TSTR, "text");
Как-то странно это. Разве тип строки скрипта не определяется системой? (ANSI в 9x, Unicode в 2000 и выше)

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

Post by FeyFre »

Т.е. получается, что для вывода строк из скрипта по сути нужно использовать что-то вроде
Во-первых, в формуле должно быть _SIZE (_TSTR это "A" или"W" ) .
Во-вторых, забыл в формуле -1: 4 + _TSIZE = 5 или 6 (_TSIZE == 1 или 2)
В-третьих, из скрипта можно всегда использовать Юникод вариант, ибо WSH реализован на COM который только Юникод. Разве что передашь аргументом указатель на нативную память(выделенные и заполненных через MemAlloc, MemCopy), что будет очень редким исключением.

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

(_TSTR это "A" или"W" )
Неправда.

_TSTR
_____

Константа, определяющая тип строки. Используется для методов MemCopy и MemRead.

_TSTR

Возвращаемое значение
Число. 0 - DT_ANSI - однобайтовая строка (Windows 95/98/Me).
1 - DT_UNICODE - двухбайтовая строка (Windows NT/2000/XP).


В-третьих, из скрипта можно всегда использовать Юникод вариант, ибо WSH реализован на COM который только Юникод.
Спасибо. Точно, всё время забываю, что в неюникодной системе есть что-то юникодное :)

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

Post by FeyFre »

Неправда. Scripts-Rus.txt
Действительно то _TCHAR. Но как оказалось это не важно :)

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Если клацнуть правой клавишей мыши по заголовку окна Log::Output, то появляется всплывающее меню, но команды "Очистить" и "Выделить все" не работают. Если же клацнуть над окном редактирования Log::Output, то во всплывающем меню все команды работают.

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

Post by Instructor »

Исправлено: контекстное меню на заголовке плагина (Log::Output).

Fixed: context menu on plugin caption (Log::Output).


Log plugin v2.2

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

Post by FeyFre »

В общем такая вот пакость(Log 2.2):
1. Открыл лог-файл.
2. Включил Log::Watch(Настройки: интервал обновления 1сек, "не перемещать курсор в конец файла". MDI).
Оно себе работает.
3. Занимаюсь своими делами дальше, в том числе и удаляю файл за которым наблюдает лог. При этом к активному наблюдению за логом я вернусь на много позже.
4. Доходят руки до лога(вновь запустил приложение пишущее лог) - переключаюсь на АР. Сюрприз: меня переключило на окно "Can't open file. Plugin will be stopped." в правом нижнем углу. Короче, этих окон там, мягко говоря, много - по окну на каждую секунду после удаления файла.
Надо как-то притормозить с выдачей этих окон, хватит и одного.
Post Reply