Результаты выполнения консольной программы
Есть у меня такая проблемка - как бороться не знаю.
Вообщем надо выполнить консольную програмку (типа cmd /c dir) или что-то в этом духе и принять результат ее работы в какой-нибудь AnsiString (или во что-нибудь другое).
Если просто вызывать ShelExecute - то она выполняет команду, а вот как перехватить результат работы?
Всем привет!
Есть у меня такая проблемка - как бороться не знаю.
Вообщем надо выполнить консольную програмку (типа cmd /c dir) или что-то в этом духе и принять результат ее работы в какой-нибудь AnsiString (или во что-нибудь другое).
Если просто вызывать ShelExecute - то она выполняет команду, а вот как перехватить результат работы?
Я не знаю. Но первое что в голову пришло ето перенаправлять для нее стандартный вивод. А вот как ??? Если сделаеш то сообщи. А еще моно анализировать видеопамять.
А еще вариант. Напиши резидент которий перехватывает то прерывание каким вивод осуществляется и тогда вивод в твоих руках :). Но тогда надо будет запускать кооманд, а в нем резидент и консольную прогу. И не знаю прокатит ли такое для консольапликейшен или токо для досовских.
Вобщем вот тебе куча глупих идей. Мо что и получится.
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 - если русская система). Как лучше конвертнуть кодировку? Могу, конечно руками, каждый символ, но, наверное, есть и другой метод, уже готовый к употреблению?
Всем привет!
Есть у меня такая проблемка - как бороться не знаю.
Вообщем надо выполнить консольную програмку (типа cmd /c dir) или что-то в этом духе и принять результат ее работы в какой-нибудь AnsiString (или во что-нибудь другое).
Если просто вызывать ShelExecute - то она выполняет команду, а вот как перехватить результат работы?
Pipe тебе поможет!
Вот пример двухгодовалой давности:
http://forum.codenet.ru/showthread.php?s=&threadid=13501
Sleep(unsigned(1000));
можно с легкостью использовать spawnl с параметром P_WAIT
можно с легкостью использовать spawnl с параметром P_WAIT
Да было бы можно, если как-нибудь запустить ее в фоне. ShellExecute можно дать параметр SW_HIDE. Можно ли сделать подобное с spawnl?
P.S. За то этот метод действительно помогает правильно дождаться конца процесса.
P.S2. Про кодировку доса - это я вчера, видимо уже ночью писал. Memo1->Font->Charset=OEM_CHARSET решает проблему.
Юзаю CreateProcess.
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);
Теперь нормально ждет завершения и не выводит окошко с консолью.
Я не знаю. Но первое что в голову пришло ето перенаправлять для нее стандартный вивод. А вот как ??? Если сделаеш то сообщи. А еще моно анализировать видеопамять.
А еще вариант. Напиши резидент которий перехватывает то прерывание каким вивод осуществляется и тогда вивод в твоих руках :). Но тогда надо будет запускать кооманд, а в нем резидент и консольную прогу. И не знаю прокатит ли такое для консольапликейшен или токо для досовских.
Вобщем вот тебе куча глупих идей. Мо что и получится.
А почему в голову не приходит заглянуть в примеры поставляемые в комплекте? Точнее: $(BCB)\Examples\WinTools
или Поиском воспользоваться?
http://www.codenet.ru/progr/bcb/pipes.php
А чем pipe не подошел?
Да наверное-бы подошел, но я просто не понял, как он работает - а код надо было сдавать.
Но всеравно спасибо за идею. В следующей версии (если такая будет) попробую сделать пайп.