有不有什么办法把输出到控制台的东西直接导到一个编辑框?

cyclamen 2000-09-14 03:35:00


有一个写好的程序,输出是打印到控制台的,
现在想在VC里直接用这个程序,但输出定向到一个编辑框
该怎么做????
...全文
356 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Holly 2000-09-19
  • 打赏
  • 举报
回复
上文中的一些变量可能需要具有全局的作用域,具体要看你的程序如何安排!
Holly 2000-09-19
  • 打赏
  • 举报
回复
鉴于全文解释的内容比较多,先给出问题的解决方案的大概流程!可先照做,原因待文章补完后可知!

下列的代码如果不想堵塞主进程的话,需要在一个线程中运行!
//声明两个句柄:

HANDLE hConnectRead,
hConnectWrite;

//创建用来传递信息的管道;
CreatePipe(&hConnectRead, &hConnectWrite, NULL, 0);
//使read的句柄不可继承;
DuplicateHandle(GetCurrentProcess(),
hConnectRead, GetCurrentProcess(),
NULL, 0, FALSE,
DUPLICATE_SAME_ACCESS));
//启动read的进程!
DWORD dwThreadID;

CreateThread(NULL, 0, ReadProc, (LPVOID)(&hConnectRead), 0, &dwThreadID) //或其他启动的方式;

//启动进程;
STARTUPINFO StartInfo;
PROCESS_INFORMATION ProcessInfo;
memset( &StartInfo, 0, sizeof(STARTUPINFO) );
StartInfo.cb = sizeof(STARTUPINFO);
StartInfo.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
StartInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
StartInfo.hStdOutput = hConnectWrite;
StartInfo.hStdError = hConnectWrite;
StartInfo.wShowWindow = SW_HIDE;
StartInfo.lpReserved = NULL;
StartInfo.cbReserved2 = 0;
StartInfo.lpReserved2 = NULL;

CreateProcess(szProcess.GetBuffer(szProcess.GetLength()), szCommandLine.GetBuffer(szCommandLine.GetLength()), NULL,
NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL,
&StartInfo, &ProcessInfo));

// 等待;
while(WaitForSingleObject(hProcess, 0) == WAIT_TIMEOUT)
{ //不用INFINITE是为了能够随时终止;
...
//判断外部的终止条件,或其他需要在进程运行时需要监测的工作!
}

/////////////////////////////////////////////
// ReadProc
{
DWORD dwReadCount;
HANDLE hRead = (HANDLE)(*(HANDLE*)lpvoidPara);
while(CanContinue()) //CanContinue()只是示意,具体如何判断,根据自己的情况!
{
FlushFileBuffers(hRead);
ReadFile(hRead, lpOutputCache, CACHE_SIZE, &dwReadCount, NULL);
//将lpOutputCache中的内容保存起来;
AddToYourDataBuffer(lpOutputCache);//自己的函数;
}
}

实际的运行中还需要一个临界区的控制将可能冲突的变量保护起来!
dragonfly 2000-09-18
  • 打赏
  • 举报
回复
如果你懂DPMI的话,这不是问题!
Holly 2000-09-18
  • 打赏
  • 举报
回复
我向大家保证20号的时候给大家一个答案!
Holly 2000-09-18
  • 打赏
  • 举报
回复
Sorry!出差+其他事没能及时整理!
cyclamen 2000-09-17
  • 打赏
  • 举报
回复
holly 文章整理好了吗
haitian99 2000-09-15
  • 打赏
  • 举报
回复
关注
dolp_su 2000-09-15
  • 打赏
  • 举报
回复
care.
wsoft 2000-09-14
  • 打赏
  • 举报
回复
thank beforehand!
Holly 2000-09-14
  • 打赏
  • 举报
回复
这个问题实在很难三言两语就能讲清楚!待我整理一篇文章给大家共享!
Holly 2000-09-14
  • 打赏
  • 举报
回复
StdHandle替换的方法:
自己创建:
CreatePipe(hRead, hWrite, NULL, 0);
将hRead, hWrite在CreateProcess的调用参数中传给子进程!
<待续>
Holly 2000-09-14
  • 打赏
  • 举报
回复
想知道一般开发工具的做法吗?
都是用CreateProcess()将StdHandle替换掉!
<待续>
Kevin_qing 2000-09-14
  • 打赏
  • 举报
回复
好象还有其它方法吧,我想知道
U皮特U 2000-09-14
  • 打赏
  • 举报
回复
以下思路不是最佳方案,仅供参考:
控制台程序支持重定向到文件,然后读取文件内容到编辑框即可。
假设你的程序名为xxx,编辑一个批处理文件n.bat,内容为:xxx > 1.log

_unlink("c:\\1.log");
ShellExecute(m_hWnd, "open", "c:\\n.bat", "", "c:\\", SW_SHOW);

// 判断控制台程序执行结束

char buff[10240];
CFile f;
if ( f.Open( "c:\\1.log", CFile::modeRead) )
{
UINT uBytes = f.GetLength();
f.Read((void*)buff, uBytes);
f.Close();
buff[uBytes] = 0;
m_edit.SetWindowText(buff);



需要解决的问题有:识别程序结束,自动关闭DOS框后再读取文件内容。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧