MFCで長時間のコンソールプロセスを開始し、その出力を32ビットWindowsアプリケーションのテキスト領域。MFC:プロセスがWin32テキストエリア(mfcアプリケーション)で実行中に非同期(同時)に出力を表示
パイプを使用しましたが、プロセスが終了した後にのみ出力が表示されます。 私は_popenを試しました。これはコンソールベースのアプリケーションでは動作しますが、win32アプリケーションとは互換性がありません。
インターネットを検索しているときにCLRを使用して多数のコードが見つかりましたが、.NETの使用なしでMFCで何らかの方法が必要です。
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:私はこのコードを統合するために作っています、私は、x86のWindows上のVisual Studio 2010を使用しています7.ここ
は、アプリケーションを起動する私のコードです:-)事前に
THANKSしたがって、winPEではMFCが強く必要です。
おかげで!私は上記のコードを使用しました。再度プロセスの出力は終了後に表示されます。同時出力を取得する必要があります。 – Konark
私は、worker_threadが適切なapporachであることをkids_foxに同意します。しかし、私はメッセージ処理ループがそのトリックを作るべきだと思います。たぶんあなたはGetMessageの代わりにPeekMessage(&msg、NULL、0、0、PM_REMOVE)を使うべきです...長いことでした。しかし、それは他の問題かもしれません...あなたは確かにパイプがチャンクでデータを取得していますか? –
返信用の@JavierDePedroに感謝しますが、rpipeを読むために別のワーカースレッドを使用しました。ウィンドウメッセージとハンドラを使用しましたが、出力は同じです。バックグラウンド・プロセスが終了したときにのみ出力が表示されます。 PLZヘルプ。 – Konark