AkelPad Forum Index AkelPad
Support forum
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Log plugin
Goto page Previous  1, 2, 3, 4, 5, 6, 7, 8, 9, 10  Next
 
Post new topic   Reply to topic    AkelPad Forum Index -> Plugins
View previous topic :: View next topic  
Author Message
DV



Joined: 16 Nov 2006
Posts: 840
Location: Kyiv, Ukraine

PostPosted: Wed Mar 14, 2012 12:38 pm    Post subject: Reply with quote

FeyFre wrote:
на сколько я понимаю окружение наследуется от процесса.

Вот и я так понимаю.
Но почему на деле получается, что WshShell.Run и AkelPad.Exec подхватывают предварительно установленные переменные, передавая их дочернему процессу, а Log::Output - нет?

Добавлено чуть позже:
Хотя нет, у меня есть мысли по поводу того, как такое могло произойти. Сразу после запуска команды в RunMe.js я восстанавливаю первоначальное значение переменных окружения. Т.е. если AkelPad.Call("Log::Output", 1, cmd, dir) вернул управление до того, как дочерний процесс фактически стартовал, скрипт может успеть восстановить переменные окружения ещё до того, как дочерний процесс их подхватит. Опять гонки фронтов, короче...

Добавлено ещё чуть позже:
Да, так и есть, врот ми имейл... Поставил WScript.Sleep(2000) между runCommand(cmd, fileDir) и восстановлением переменных окружения - теперь всё работает.
Back to top
View user's profile Send private message
FeyFre



Joined: 07 Aug 2007
Posts: 2038
Location: Vinnitsa, Ukraine

PostPosted: Wed Mar 14, 2012 2:23 pm    Post subject: Reply with quote

DV, фух, я уже начал думать невесть что(что CreateProcess халтурит, и среда "унаследуется" значительно позже чем CreateProcess возвращает управление. Уже Руссиновича хотел искать.). Но заглянул в исходник и обнаружил что AkelPad.Call("Log::Output", 1 фактически порождает поток, который и запустит дитё, ну и остается работать дальше. Тогда да, создание дитя может быть начато после возврат исходной среды. Правда ждать эти две секунды - тоже не надежный выход. Нужно требовать ожидание фактического создания процесса перед возвратом.
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
DV



Joined: 16 Nov 2006
Posts: 840
Location: Kyiv, Ukraine

PostPosted: Wed Mar 14, 2012 2:27 pm    Post subject: Reply with quote

FeyFre wrote:
Нужно требовать ожидание фактического создания процесса перед возвратом

... для чего потребуется что-то новое в реализации Log::Output Wink
Back to top
View user's profile Send private message
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5325

PostPosted: Thu Mar 15, 2012 9:42 am    Post subject: Reply with quote

DV
В версии 1.8:

GetOutputExecThread.js
Code:
WScript.Echo(GetOutputExecThread(true));

function GetOutputExecThread(bWait)
{
  var lpExecThread;
  var hExecThread=0;
  var oSys=AkelPad.SystemFunction();

  if (lpExecThread=AkelPad.MemAlloc(_X64?8:4 /*sizeof(HANDLE)*/))
  {
    AkelPad.Call("Log::Output", 3, lpExecThread);
    hExecThread=AkelPad.MemRead(lpExecThread, 2 /*DT_QWORD*/);
    if (hExecThread && bWait)
      oSys.Call("kernel32::WaitForSingleObject", hExecThread, 0xFFFFFFFF /*INFINITE*/);
    AkelPad.MemFree(lpExecThread);
  }
  return hExecThread;
}
Back to top
View user's profile Send private message Send e-mail
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5325

PostPosted: Thu Mar 15, 2012 9:44 am    Post subject: Reply with quote

Добавлено: внешний вызов с кодом 3 для получения информации о текущем запущенном приложении (Log::Output).

Added: external call with code 3 to get information about the current executed application (Log::Output).


Log plugin v1.8
Back to top
View user's profile Send private message Send e-mail
DV



Joined: 16 Nov 2006
Posts: 840
Location: Kyiv, Ukraine

PostPosted: Thu Mar 15, 2012 11:06 am    Post subject: Reply with quote

Instructor wrote:
GetOutputExecThread.js

В моём случае несколько сложней будет. Что-то вроде такого:
Code:
// поток ещё не стартовал
hThread = 0;
hProcess = 0;
do {
  Sleep(100);
  Call("Log::Output", 3, hThread, hProcess);
} while (!hThread && !hProcess);
// поток и процесс уже стартовали
// теперь можно восстанавливать переменные окружения

Тут главное, чтобы процесс не успел начаться и завершиться за 100 мс Smile
Back to top
View user's profile Send private message
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5325

PostPosted: Thu Mar 15, 2012 11:25 am    Post subject: Reply with quote

DV
Code:
AkelPad.Call("Log::Output", 1, "program.exe");
//Тут hThread уже существует, hProcess может не существовать.

//Дождемся старта процесса или выхода из выполнения.
for (;;)
{
  AkelPad.Call("Log::Output", 3, hThread, hProcess);
  if (!hThread || hProcess) break;
  WScript.Sleep(100);
}
Back to top
View user's profile Send private message Send e-mail
FeyFre



Joined: 07 Aug 2007
Posts: 2038
Location: Vinnitsa, Ukraine

PostPosted: Thu Mar 15, 2012 11:58 am    Post subject: Reply with quote

Уточните. Вот эти юзекейсы - только для последнего запущенного процесса? Ведь я захочу запустить параллельно штук 5.
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
DV



Joined: 16 Nov 2006
Posts: 840
Location: Kyiv, Ukraine

PostPosted: Thu Mar 15, 2012 12:24 pm    Post subject: Reply with quote

FeyFre wrote:
Ведь я захочу запустить параллельно штук 5.

Это как? Ведь в окне Output показывается выполнение текущего (т.е. одного) процесса.

Посмотрел ещё список возможностей плагина и с удивлением обнаружил, что нет такой команды, как
Code:
AkelPad.Call("Log::Output", 4, "Строка, которую я хочу вывести в панель Output из своего скрипта")

Непорядок! Wink
Back to top
View user's profile Send private message
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5325

PostPosted: Thu Mar 15, 2012 1:31 pm    Post subject: Reply with quote

DV wrote:
Непорядок! Wink
См. SearchReplace.js "Найти все".
Back to top
View user's profile Send private message Send e-mail
VladSh



Joined: 29 Nov 2006
Posts: 2610
Location: Киев, Русь

PostPosted: Thu Mar 15, 2012 1:57 pm    Post subject: Reply with quote

В Scripts.zip и PlugsPack.zip скрипт SearchReplace.js от 19.02, и в нём нет вхождений "Найти все" или "Call("Log::Output", 4,".

Строка
Code:
AkelPad.Call("Log::Output", 4, "Строка, которую я хочу вывести в панель Output из своего скрипта");
не работает.
Back to top
View user's profile Send private message Visit poster's website
FeyFre



Joined: 07 Aug 2007
Posts: 2038
Location: Vinnitsa, Ukraine

PostPosted: Thu Mar 15, 2012 1:59 pm    Post subject: Reply with quote

Quote:
Это как? Ведь в окне Output показывается выполнение текущего (т.е. одного) процесса.
1. Ну а кто сказал что я хочу в это окно. Может я хочу в новую вкладку. И каждый процесс в свою.
2. Я себе захочу настроить регулярку для избирательно вывода. Таким образом даже тысяча запущенных детей особо за одно окно не поругаются.
Quote:
Посмотрел ещё список возможностей плагина и с удивлением обнаружил, что нет такой команды, как
Зачем? Ведь есть такая
Code:
AkelPad.Call("Log::Output", 2, WINDOW);
AkelPad.SetEditWnd(WINDOW)
AkelPad.SetSel(-1,-1)
AkelPad.ReplaceSel("blah")
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
VladSh



Joined: 29 Nov 2006
Posts: 2610
Location: Киев, Русь

PostPosted: Thu Mar 15, 2012 2:06 pm    Post subject: Reply with quote

FeyFre wrote:
Зачем? Ведь есть такая...
Чтобы меньше напрямую с API работать.
Скоро многие скрипты будут использовать вывод в консоль, и это что, во все скрипты копипастить этот (ещё и функцию получения hWndOutput) код? В большинстве случаев гораздо проще и лучше вывести текст в консоль лога одной строкой - методом с определёнными параметрами (оставить параметр boolean для bSelect).


Last edited by VladSh on Thu Mar 15, 2012 2:12 pm; edited 2 times in total
Back to top
View user's profile Send private message Visit poster's website
DV



Joined: 16 Nov 2006
Posts: 840
Location: Kyiv, Ukraine

PostPosted: Thu Mar 15, 2012 2:07 pm    Post subject: Reply with quote

Instructor wrote:
См. SearchReplace.js "Найти все".

Но это же страшно сложно! Shocked Нет, правда:
- сначала нужно узнать хэндл окна Output,
- затем вычитать весь текст из этого окна,
- затем добавить к этому тексту свою строку,
- и, наконец, установить новый текст.
И это всё можно было бы сделать с помощью одной строчки кода AkelPad.Call("Log::Output", 4, "Моя новая строка").
Back to top
View user's profile Send private message
VladSh



Joined: 29 Nov 2006
Posts: 2610
Location: Киев, Русь

PostPosted: Thu Mar 15, 2012 2:10 pm    Post subject: Reply with quote

DV wrote:
Но это же страшно сложно!
Я ж об этом чуть выше.
Но не то, чтобы сложно, а геморно.

DV wrote:
- затем вычитать весь текст из этого окна,
- затем добавить к этому тексту свою строку,
Параметр "Заменять или добавлять".
Back to top
View user's profile Send private message Visit poster's website
Display posts from previous:   
Post new topic   Reply to topic    AkelPad Forum Index -> Plugins All times are GMT
Goto page Previous  1, 2, 3, 4, 5, 6, 7, 8, 9, 10  Next
Page 4 of 10

 
Jump to:  
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


SourceForge.net Logo Powered by phpBB © 2001, 2005 phpBB Group