Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Результаты выполнения консольной программы

830
22 ноября 2005 года
MVal
76 / / 17.10.2002
Всем привет!
Есть у меня такая проблемка - как бороться не знаю.
Вообщем надо выполнить консольную програмку (типа cmd /c dir) или что-то в этом духе и принять результат ее работы в какой-нибудь AnsiString (или во что-нибудь другое).
Если просто вызывать ShelExecute - то она выполняет команду, а вот как перехватить результат работы?
276
22 ноября 2005 года
Rebbit
1.1K / / 01.08.2005
Цитата:
Originally posted by MVal
Всем привет!
Есть у меня такая проблемка - как бороться не знаю.
Вообщем надо выполнить консольную програмку (типа cmd /c dir) или что-то в этом духе и принять результат ее работы в какой-нибудь AnsiString (или во что-нибудь другое).
Если просто вызывать ShelExecute - то она выполняет команду, а вот как перехватить результат работы?


Я не знаю. Но первое что в голову пришло ето перенаправлять для нее стандартный вивод. А вот как ??? Если сделаеш то сообщи. А еще моно анализировать видеопамять.
А еще вариант. Напиши резидент которий перехватывает то прерывание каким вивод осуществляется и тогда вивод в твоих руках :). Но тогда надо будет запускать кооманд, а в нем резидент и консольную прогу. И не знаю прокатит ли такое для консольапликейшен или токо для досовских.
Вобщем вот тебе куча глупих идей. Мо что и получится.

830
22 ноября 2005 года
MVal
76 / / 17.10.2002
Вообщем придумал я такую штуку: направить результат выполнения во временный файл, считать из него, удалить этот файл.
 
Код:
AnsiString Command="dir";
ShellExecute(NULL,NULL,"cmd",AnsiString("/c "+Command+">c:\\out.txt").c_str(),NULL,SW_HIDE);
Sleep(unsigned(1000));
Memo1->Lines->LoadFromFile("c:\\out.txt");
DeleteFile("c:\\out.txt");

Только вот как лучше избавится от этого Sleep-а, т.е. как узнать, когда эта консольная програмка закончила работу.
Я вижу 2 варианта, подскажите, что лучше:
1. Вроде-бы можно запускать ее не через ShellExecute, а через CreateProcess, но я чего-то с первого раза не понял, как его запускать.
2. А может лучше следить за состоянием выходящего файла, когда он будет доступен? Как это лучше сделать?

P.S. Вот еще такой момент. Этот файл получается в кодировке DOS-а (866 - если русская система). Как лучше конвертнуть кодировку? Могу, конечно руками, каждый символ, но, наверное, есть и другой метод, уже готовый к употреблению?
3
22 ноября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by MVal
Всем привет!
Есть у меня такая проблемка - как бороться не знаю.
Вообщем надо выполнить консольную програмку (типа cmd /c dir) или что-то в этом духе и принять результат ее работы в какой-нибудь AnsiString (или во что-нибудь другое).
Если просто вызывать ShelExecute - то она выполняет команду, а вот как перехватить результат работы?


Pipe тебе поможет!
Вот пример двухгодовалой давности:
http://forum.codenet.ru/showthread.php?s=&threadid=13501

1.9K
23 ноября 2005 года
Anton Chik
175 / / 26.09.2005
мне кажется вместо
 
Код:
ShellExecute(NULL,NULL,"cmd",AnsiString("/c "+Command+">c:\\out.txt").c_str(),NULL,SW_HIDE);
Sleep(unsigned(1000));


можно с легкостью использовать spawnl с параметром P_WAIT
830
23 ноября 2005 года
MVal
76 / / 17.10.2002
Цитата:
Originally posted by Anton Chik
можно с легкостью использовать spawnl с параметром P_WAIT


Да было бы можно, если как-нибудь запустить ее в фоне. ShellExecute можно дать параметр SW_HIDE. Можно ли сделать подобное с spawnl?

P.S. За то этот метод действительно помогает правильно дождаться конца процесса.

P.S2. Про кодировку доса - это я вчера, видимо уже ночью писал. Memo1->Font->Charset=OEM_CHARSET решает проблему.

830
23 ноября 2005 года
MVal
76 / / 17.10.2002
Все, придумал.
Юзаю CreateProcess.
Код:
AnsiString Command=ComboBox1->Text;
AnsiString FileName="c:\\out.txt";
AnsiString strCmdLine="e:\\windows\\system32\\cmd.exe /c "+Command+">"+FileName;
 PROCESS_INFORMATION     piProcInfo;
 STARTUPINFO             siStartInfo;
 siStartInfo.cb          = sizeof(STARTUPINFO);
 GetStartupInfo(&siStartInfo);
 siStartInfo.wShowWindow=SW_HIDE;
if (!CreateProcess(NULL,strCmdLine.c_str(),NULL,NULL,0,0,NULL,NULL,&siStartInfo,&piProcInfo))
{
    ShowMessage("Not run");
    return;
};
DWORD rc = WaitForSingleObject(piProcInfo.hProcess,INFINITE);
Memo1->Lines->LoadFromFile(FileName);
DeleteFile(FileName);

Теперь нормально ждет завершения и не выводит окошко с консолью.
3
25 ноября 2005 года
Green
4.8K / / 20.01.2000
А чем pipe не подошел?
246
28 ноября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by Rebbit
Я не знаю. Но первое что в голову пришло ето перенаправлять для нее стандартный вивод. А вот как ??? Если сделаеш то сообщи. А еще моно анализировать видеопамять.
А еще вариант. Напиши резидент которий перехватывает то прерывание каким вивод осуществляется и тогда вивод в твоих руках :). Но тогда надо будет запускать кооманд, а в нем резидент и консольную прогу. И не знаю прокатит ли такое для консольапликейшен или токо для досовских.
Вобщем вот тебе куча глупих идей. Мо что и получится.


А почему в голову не приходит заглянуть в примеры поставляемые в комплекте? Точнее: $(BCB)\Examples\WinTools
или Поиском воспользоваться?
http://www.codenet.ru/progr/bcb/pipes.php

830
29 ноября 2005 года
MVal
76 / / 17.10.2002
Цитата:
Originally posted by Green
А чем pipe не подошел?


Да наверное-бы подошел, но я просто не понял, как он работает - а код надо было сдавать.
Но всеравно спасибо за идею. В следующей версии (если такая будет) попробую сделать пайп.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог