I want to develop an application in MFC which could start a lengthy console process and give its output concurrently on a text area of 32bit windows application.
I used pipes, but it display the output only after the process has terminated. I tried _popen, it works for console based application, but not compatible with win32 application.
while searching internet, I found numerous code using CLR, but I need some way in MFC, without use of .Net.. Plz help.
THANKS in Advance :-)
Here's my code that start the application:
void CAppMgr_BackupsDlg::ExecuteExternalFile(CString csExeName, CString csArguments)
{
CString csExecute;
csExecute=csExeName + " " + csArguments;
SECURITY_ATTRIBUTES secattr;
ZeroMemory(&secattr,sizeof(secattr));
secattr.nLength = sizeof(secattr);
secattr.bInheritHandle = TRUE;
HANDLE rPipe, wPipe;
//Create pipes to write and read data
CreatePipe(&rPipe,&wPipe,&secattr,0);
STARTUPINFO sInfo;
ZeroMemory(&sInfo,sizeof(sInfo));
PROCESS_INFORMATION pInfo;
ZeroMemory(&pInfo,sizeof(pInfo));
sInfo.cb=sizeof(sInfo);
sInfo.dwFlags=STARTF_USESTDHANDLES;
sInfo.hStdInput=NULL;
sInfo.hStdOutput=wPipe;
sInfo.hStdError=wPipe;
char command[1024];
strcpy(command, csExecute.GetBuffer(csExecute.GetLength()));
//Create the process here.
CreateProcess(0, command,0,0,TRUE,
NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW,0,0,&sInfo,&pInfo);
CloseHandle(wPipe);
//now read the output pipe here.
char buf[100];
DWORD reDword;
CString m_csOutput,csTemp;
BOOL res;
do
{
res=::ReadFile(rPipe,buf,100,&reDword,0);
csTemp=buf;
m_csOutput=csTemp.Left(reDword);
DisplayToTextArea(m_csOutput);
}
while(res);
}
PS: I am using Visual studio 2010 on x86 windows 7. I am making this code to be integrated with winPE, therefore strongly need MFC.
The problem seems the loop to read the pipe is blocking the UI main thread of your application so that your dialog is not updated until the loop finished.
There are some things you can do to solve this problem but the easiest way would be to add a message processing loop to your do-while loop after calling DisplayToTextArea:
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg); // send to window proc
}
来源:https://stackoverflow.com/questions/9480030/mfc-display-output-of-a-process-asynchronouslyconcurrently-while-process-is-i