Render.ru

Занятная проблемка :)

#1
Нужно перехватить консольный вывод из Shake for Win. Грубо говоря сграбастать StdOut и засовать в пайп, в файл или в сокет, начхать.
Запускаю Shake через CreateProcess, ловлю хэндл, присваиваю хендл hStdOutput в файло, а там пусто :) Куда эта зараза пишет STDOUT???!!! :))) Даже если просто в консоли попробовать перенаправить вывод в файл (типа shake.... > blabla.txt), то всё равно не пашет.

Мужики, может есть на этот счёт какие мысли? Если допишу хрень, для которой это необходимо, обещаю поделиться со всеми :)
 
#3
Саня, Родина тебя не забудет!!!
Правда мну не совсем понятна, на хрена это дело совать в StdErr, а как-же кхультура программирования, фсякие там "юних-вэй" и иже с ним? Гы гы гы.
Для фсех интиресующихся привожу пример того, что я выгрыз из StartupInfo.hStdError Шейка :)

info: rendering frame 1

info: processing: 8%
info: processing: 16%
info: processing: 24%
info: processing: 32%
info: processing: 40%
info: processing: 47%
info: processing: 55%
info: processing: 63%
info: processing: 71%
info: processing: 79%
info: processing: 86%
info: processing: 94%
info: processing: 100%
info: frame 1 rendered in 3.281s
info: rendering frame 2

info: processing: 8%
info: processing: 16%
info: processing: 24%
info: processing: 32%
info: processing: 40%
info: processing: 47%
info: processing: 55%
info: processing: 63%
info: processing: 71%
info: processing: 79%
info: processing: 86%
info: processing: 94%
info: processing: 100%
info: frame 2 rendered in 3.188s
 

aka_tt

Активный участник
Рейтинг
5
#4
я таки не понял как ловить шейковый консольный вывод. я тож ловил второй поток но при этом шейк у меня почему то не рендерил.. :(
анпишите плз пример командной строки?
 
#6
{Execution of Application}
function ExecApplic: boolean;
var
param : string;
t : PAnsiChar;
buff: ARRAY [0..127] OF Char;
prHandle : hWnd;
StartEn : boolean;
SecAtrtrs: TSecurityAttributes;
hOut: THandle;
dw: DWord;
begin
with SecAtrtrs do
begin
nLength := SizeOf(TSecurityAttributes);
lpSecurityDescriptor := nil;
bInheritHandle := true; //Наследуем рукоятку
end;
param := TaskName;
hOut := CreateFile('shakeout.txt', GENERIC_WRITE, 0, @SecAtrtrs, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (hOut = INVALID_HANDLE_VALUE) then RaiseLastWin32Error;
//---------------------------------------
//CreatePipe(StartupInfo.hStdError, hOut, @SecAtrtrs, 0);
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
StartupInfo.wShowWindow := SW_HIDE; // Состояние окна запущенного приложения
StartupInfo.hStdError := hOut; // Перехват StdError, мммм, НАДО ПОСТАВИТЬ ФЛАГ, ЧТО ЭТО ТОКА ДЛЯ ШАКИ!!!
// <= Без этого приложение не стартует
StartEn := CreateProcess(nil,
PChar(param), { указатель командной строки }
nil, { указатель на процесс атрибутов безопасности }
nil, { указатель на поток атрибутов безопасности }
true, { флаг родительского обработчика }
CREATE_NEW_CONSOLE or { флаг создания }
NORMAL_PRIORITY_CLASS,
nil, { указатель на новую среду процесса }
nil, { указатель на имя текущей директории }
StartupInfo, { указатель на STARTUPINFO }
ProcessInfo); { указатель на PROCESS_INF }
//-----------------------------------------
WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
Win32Check(CloseHandle(hOut));
end;
 
#7
Ключевая фигня вотъ ента
StartupInfo.hStdError := hOut;
То есть присобачивание рукоятки StdError рукоятке файла.

Насколько мне известно стандартными средствами консоли Виндовоза перехватить StdError не получится.
 

Sagroth

Пользователь сайта
Рейтинг
2
#8
Пардон, я не очень понимаю ваши code-игры, объясните пс-та, а чем не подходит в данном случае флаг vv?

shake -vv -exec script.shk
 
#9
>Насколько мне известно стандартными средствами консоли Виндовоза перехватить StdError не получится.
Это бред, все обезательно получисться главное постораться!
(можно ловить и stdout и stderror хоть оба за раз)
Сори если глупый вопрос, а что за задача в целом, ну или хотябы чуть более практический смылс ?
 
#11
>Сори если глупый вопрос, а что за задача в целом, ну или хотябы чуть более практический смылс ?

Всё просто, удалённый запуск и отслеживание что он там творит + логи есессна.
 
#12
wpiggy Написал:
-------------------------------------------------------
> Всё просто, удалённый запуск и отслеживание что он
> там творит + логи есессна.
А это :)
Да все должно быть ок, наша собсвена система рендринга по сети, отлично "ловит" output shake, да и alfred тоже справлеть с этим не плохо...
Про другие системы сказать ничег не могу так как мало пользовался

 
Сверху