Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: запуск консольного приложения с перенаправлением STDOUT  (Прочитано 10278 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Daniloff
Помогающий

ru
Offline Offline

« : 28-01-2007 16:54 » 

Из командной строки все элемнетарно: fc.exe file1.txt file2.txt >diff.log
А как из программы?!
Код:
			GetSystemDirectory(buff,256);
lstrcat(buff,"\\fc.exe ");
lstrcat(buff,_file1);
lstrcat(buff," ");
lstrcat(buff,_file2);
memset(&parms,0,sizeof(parms));
parms.cb=sizeof(parms);
parms.wShowWindow=SW_SHOWNORMAL;
parms.hStdOutput=CreateFile(_outfile,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
parms.hStdError=parms.hStdOutput;
parms.dwFlags=STARTF_USESTDHANDLES;
CreateProcessA(NULL,buff,NULL,NULL,FALSE,CREATE_NEW_CONSOLE|NORMAL_PRIORITY_CLASS,NULL,NULL,&parms,&proc);
CloseHandle(parms.hStdOutput);

Файл создается, но пустой!
Записан
tishka17
Участник

ru
Offline Offline
Не разбрасывайте мусор


« Ответ #1 : 28-01-2007 17:25 » 

как насчет system или ShellExecute с соответствующими строками...
Записан

//1001101010110100010100110011101111000010110111010101110011
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #2 : 29-01-2007 05:56 » 

Daniloff, что значит как из программы?
Есть два варианта
1. вызвать полностью команду
2. подменить STDIN/STDOUT своими потоками
Что именно нужно?
Записан

Странно всё это....
Daniloff
Помогающий

ru
Offline Offline

« Ответ #3 : 29-01-2007 13:49 » 

LogRus, пытался исполнить второй вариант...
Нашел на сайте фанов делфи аналогичный пример, полностью поворил на С...
Что-то не срабатывает Жаль
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 29-01-2007 16:16 » 

Проблема с наследованием дескрипторов потоков.  Ты передаёшь дескрипторы, локальные для отца-предка, в потомке они не видны.  Для того, чтобы потомок смог ими воспользоваться, необходимо разрешить наследование дескрипторов.

Комментарий к флагу STARTF_USESTDHANDLES (поле dwFlags структуры STARTUPINFO):
If this flag is specified when calling one of the process creation functions, the handles must be inheritable and the function's bInheritHandles parameter must be set to TRUE.

Поставь в CreateProcess параметр bInheritHandles в TRUE, и при создании файла в CreateFile разреши наследование: lpSecurityAttributes не должен быть нулевым. Скажем,
Код:
SECURITY_ATTRIBUTES securityAttrib;
securityAttrib.nLength = sizeof(SECURITY_ATTRIBUTES);
securityAttrib.bInheritHandle = TRUE;
securityAttrib.lpSecurityDescriptor = NULL;
parms.hStdOutput=CreateFile(_outfile,GENERIC_WRITE,FILE_SHARE_READ,
  &securityAttrib,
  CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

Ещё надо проинициализировать parms.hStdInput = INVALID_HANDLE_VALUE
« Последнее редактирование: 07-12-2007 21:11 от Алексей1153++ » Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Daniloff
Помогающий

ru
Offline Offline

« Ответ #5 : 30-01-2007 10:43 » 

npak, огромные респекты, все оказалось как вы и говорили!
За исключением того, что STDIN пришлось по-другому инициализровать:
Код:
	parms.hStdInput=GetStdHandle(STD_INPUT_HANDLE);	//INVALID_HANDLE_VALUE;
bInheritHandles - моя промашка, проморгал... Улыбаюсь  А про наследование вообще нечеткие представления имел.
Надо эту ветку занести в базу знаний, наверняка кому-то еще пригодится.
« Последнее редактирование: 30-01-2007 10:51 от Daniloff » Записан
Daniloff
Помогающий

ru
Offline Offline

« Ответ #6 : 30-01-2007 12:46 » 

Новые проблемы: если вызывающая программа - консольная, parms.hStdInput=GetStdHandle(STD_INPUT_HANDLE) работает.
Если GUI - GetStdHandle(STD_INPUT_HANDLE) возвращает 0;
Я пока сделал так: parms.hStdInput=(HANDLE)3, но не уверен, что это правильно... Жаль
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #7 : 30-01-2007 13:05 » 

у программы с гуёй по умолчанию нет консоли, но её можно создать Улыбаюсь
думаю тебе проще создать свой поток, и указать его(дескриптор файла асоциированный с потоком) в качестве STDIN
parms.hStdInput = MyStream;
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines