首页| 论坛| 消息

回复: 如何在图形界面中实时捕获控制台程序的标准输出?
#6 [zh_qk 04-17 22:31]
对了上面的源码中,你注意的两个类是
class CRedirect
{
定义很长,就省了。
}
class CRedir : public CRedirect
{
protected:
void OnChildWrite(UINT OutputID, LPCSTR lpszOutput);
protected:
virtual void OnChildStarted(LPCSTR lpszCmdLine);
virtual void OnChildStdOutWrite(LPCSTR lpszBuffer);
virtual void OnChildStdErrWrite(LPCSTR lpszBuffer);
virtual void OnChildTerminate();
};
下面的函数是输出函数
void CRedir::OnChildWrite(UINT OutputID, LPCSTR lpszOutput)
{
CFrameWnd *pFrame = (CFrameWnd*)AfxGetMainWnd();
if (pFrame != NULL)
{
if (theApp.m_bOemToAnsi)
{
int len = strlen(lpszOutput);
char *lpszBuffer = new CHAR;
strcpy(lpszBuffer, lpszOutput);
::OemToChar(lpszBuffer, lpszBuffer);
CopyData(pFrame->m_hWnd, OutputID, NULL, lpszBuffer, strlen(lpszBuffer)+1);
delete [] lpszBuffer;
}
else
CopyData(pFrame->m_hWnd, STDIO_WRITE_TEXT, NULL, lpszOutput, strlen(lpszOutput)+1);
}
}
(你把两个红色的地方改一下)
#7 [colrain 04-18 08:44]
谢谢您,我研究下。
#8 [sinl 04-18 09:58]
111
#9 [colrain 04-26 09:01]
依然没有搞定,在邦分析下吧。 我现在是这样。
QApplicationapp( argc, argv );
QTextEdit te;
QProcess selfProc;
app.setActiveWindow(&te);
te.show();
selfProc.start("..\\test");//一个循环程序。
if(! selfProc.waitForStarted())
return false;
/* pTextOutputThrd.start();*/
char buf[1024];
memset(buf, 0,sizeof(buf));
while(selfProc.waitForReadyRead())
{
selfProc.readLine(buf, sizeof (buf));
te.append(buf);//关键在这里, buf中可以得到正确字符串输出,但是te中没有显示
}
if(!selfProc.waitForFinished())
{
return FALSE;
}
/*pTextOutputThrd.wait();*/
return app.exec();

//关键在这里, buf中可以得到正确字符串输出,但是te中没有显示, 我试着另外起个线程,但是也不能成功。郁闷ing.。邱高手们在给看下吧。
#10 [colrain 04-26 11:53]
是否因为我所起的线程用的是进程外的资源的缘故呢

<< 1 2 >> (2/2)

回复 发表
主题 版块