请问高手怎么把控制台的输出转到EDIT控件里面? 不知道应该在哪里问,这里高手如云,贴到这来了。 就是让我的EDIT控件成为另外一个CONSOLE程序的STDOUT,有办法么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以,创建一个匿名管道SECURITY_ATTRIBUTES saPipe;saPipe.nLength = sizeof(SECURITY_ATTRIBUTES);saPipe.lpSecurityDescriptor = NULL;saPipe.bInheritHandle = TRUE;BOOL bRet = CreatePipe(&hRead, &hWrite, &saPipe, 0); // 创建匿名管道然后ReadFile(hRead, ReadBuf, 100, &ReadNum, NULL)读取 对对,就是匿名管道,这里的 hRead,hWrite 应该传什么? STARTUPINFO si; PROCESS_INFORMATION pi; SECURITY_ATTRIBUTES saPipe; saPipe.nLength = sizeof(SECURITY_ATTRIBUTES); saPipe.lpSecurityDescriptor = NULL; saPipe.bInheritHandle = TRUE; char ReadBuf[100]; DWORD ReadNum; HANDLE hRead; // 管道读句柄 HANDLE hWrite; // 管道写句柄 BOOL bRet = CreatePipe(&hRead, &hWrite, &saPipe, 0); // 创建匿名管道 // 得到本进程的当前标准输出 HANDLE hTemp = GetStdHandle(STD_OUTPUT_HANDLE); GetStartupInfo(&si); // 获取本进程的STARTUPINFO结构信息 //si.hStdInput = hRead; si.hStdOutput=hWrite; si.hStdError=hWrite; si.dwFlags=STARTF_USESTDHANDLES; si.cb=sizeof(si); si.wShowWindow = SW_HIDE; si.dwXSize = si.dwYSize = 0; bRet = CreateProcess(NULL, "ping www.baidu.com -t", NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi); // 创建子进程 SetStdHandle(STD_OUTPUT_HANDLE, hTemp); // 恢复本进程的标准输出 CloseHandle(hWrite); // 关闭写句柄 // 读管道直至管道关闭 while (ReadFile(hRead, ReadBuf, 100, &ReadNum, NULL)) { ReadBuf[ReadNum] = '\0'; CString strMsg; strMsg.Format("从管道:[%s]\n", ReadBuf, ReadNum); m_list.AddString(strMsg); m_list.UpdateWindow(); } 请问 seu07201213 兄,为什么在读管道之前就已经把写句柄关闭了呢? CloseHandle(hWrite); // 关闭写句柄还有,虽然用了 si.wShowWindow = SW_HIDE;但是我的控制台窗口还是显示的。STARTUPINFO si;PROCESS_INFORMATION pi;SECURITY_ATTRIBUTES saPipe;saPipe.nLength = sizeof(SECURITY_ATTRIBUTES);saPipe.lpSecurityDescriptor = NULL;saPipe.bInheritHandle = TRUE;char ReadBuf[100];DWORD ReadNum;HANDLE hRead; // 管道读句柄HANDLE hWrite; // 管道写句柄BOOL bRet = CreatePipe(&hRead, &hWrite, &saPipe, 0); // 创建匿名管道// 得到本进程的当前标准输出HANDLE hTemp = GetStdHandle(STD_OUTPUT_HANDLE);GetStartupInfo(&si); // 获取本进程的STARTUPINFO结构信息si.hStdOutput=hWrite;si.hStdError=hWrite;si.dwFlags=STARTF_USESTDHANDLES;si.cb=sizeof(si);si.wShowWindow = SW_HIDE;si.dwXSize = si.dwYSize = 0;bRet = CreateProcess(NULL, "ping 127.0.0.1", NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi); // 创建子进程SetStdHandle(STD_OUTPUT_HANDLE, hTemp); // 恢复本进程的标准输出CloseHandle(hWrite); // 关闭写句柄,为什么关闭? // 读管道直至管道关闭BOOL loop = TRUE;while (loop){ MSG msg; if( ::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE) ) { TranslateMessage(&msg); DispatchMessage(&msg); } loop = ReadFile(hRead, ReadBuf, 100, &ReadNum, NULL); ReadBuf[ReadNum] = '\0'; CString strMsg; strMsg.Format("从管道:[%s]\n", ReadBuf, ReadNum); m_list.AddString(strMsg); m_list.UpdateWindow(); } 哦,看了一下MSDN,加上 si.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;就不会出现控制台窗口了。 Win32工具条 子对话框与派生类相关联 奇怪的CString::ReleaseBuffer()错误 关于利用公用文件对话框打开多个文件的问题? 大侠们进来看看,发了好多帖子都没有解答的问题,谢谢了!!! 关于 VC++ 版本和 SDK 的问题. 怎么删除word已经打开的文件信息? 汉字国标码? 绝对初级问题,vc使用者请告诉我 菜鸟问题,望高人指点一个关于PICTURE控件和一个BUTTON控件的问题?? 求移动硬盘序列号,注意是移动硬盘的序列号!!! 大家谁能详细说一下CString的使用注意点?
创建一个匿名管道
SECURITY_ATTRIBUTES saPipe;
saPipe.nLength = sizeof(SECURITY_ATTRIBUTES);
saPipe.lpSecurityDescriptor = NULL;
saPipe.bInheritHandle = TRUE;
BOOL bRet = CreatePipe(&hRead, &hWrite, &saPipe, 0); // 创建匿名管道然后ReadFile(hRead, ReadBuf, 100, &ReadNum, NULL)读取
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES saPipe;
saPipe.nLength = sizeof(SECURITY_ATTRIBUTES);
saPipe.lpSecurityDescriptor = NULL;
saPipe.bInheritHandle = TRUE;
char ReadBuf[100];
DWORD ReadNum;
HANDLE hRead; // 管道读句柄
HANDLE hWrite; // 管道写句柄
BOOL bRet = CreatePipe(&hRead, &hWrite, &saPipe, 0); // 创建匿名管道
// 得到本进程的当前标准输出
HANDLE hTemp = GetStdHandle(STD_OUTPUT_HANDLE);
GetStartupInfo(&si); // 获取本进程的STARTUPINFO结构信息
//si.hStdInput = hRead;
si.hStdOutput=hWrite;
si.hStdError=hWrite;
si.dwFlags=STARTF_USESTDHANDLES;
si.cb=sizeof(si);
si.wShowWindow = SW_HIDE;
si.dwXSize = si.dwYSize = 0;
bRet = CreateProcess(NULL, "ping www.baidu.com -t", NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi); // 创建子进程
SetStdHandle(STD_OUTPUT_HANDLE, hTemp); // 恢复本进程的标准输出 CloseHandle(hWrite); // 关闭写句柄
// 读管道直至管道关闭
while (ReadFile(hRead, ReadBuf, 100, &ReadNum, NULL))
{
ReadBuf[ReadNum] = '\0';
CString strMsg;
strMsg.Format("从管道:[%s]\n", ReadBuf, ReadNum);
m_list.AddString(strMsg);
m_list.UpdateWindow(); }
CloseHandle(hWrite); // 关闭写句柄
还有,虽然用了
si.wShowWindow = SW_HIDE;
但是我的控制台窗口还是显示的。STARTUPINFO si;
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES saPipe;
saPipe.nLength = sizeof(SECURITY_ATTRIBUTES);
saPipe.lpSecurityDescriptor = NULL;
saPipe.bInheritHandle = TRUE;
char ReadBuf[100];
DWORD ReadNum;
HANDLE hRead; // 管道读句柄
HANDLE hWrite; // 管道写句柄
BOOL bRet = CreatePipe(&hRead, &hWrite, &saPipe, 0); // 创建匿名管道// 得到本进程的当前标准输出
HANDLE hTemp = GetStdHandle(STD_OUTPUT_HANDLE);GetStartupInfo(&si); // 获取本进程的STARTUPINFO结构信息
si.hStdOutput=hWrite;
si.hStdError=hWrite;
si.dwFlags=STARTF_USESTDHANDLES;
si.cb=sizeof(si);
si.wShowWindow = SW_HIDE;
si.dwXSize = si.dwYSize = 0;
bRet = CreateProcess(NULL, "ping 127.0.0.1", NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi); // 创建子进程
SetStdHandle(STD_OUTPUT_HANDLE, hTemp); // 恢复本进程的标准输出
CloseHandle(hWrite); // 关闭写句柄,为什么关闭?
// 读管道直至管道关闭
BOOL loop = TRUE;
while (loop)
{
MSG msg;
if( ::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
loop = ReadFile(hRead, ReadBuf, 100, &ReadNum, NULL);
ReadBuf[ReadNum] = '\0';
CString strMsg;
strMsg.Format("从管道:[%s]\n", ReadBuf, ReadNum);
m_list.AddString(strMsg);
m_list.UpdateWindow();
}
加上 si.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
就不会出现控制台窗口了。