怎样获得新进程中的console程序的标准输出 在mfc程序中启用子进程来调用一个console程序希望能把console程序中的标准输出,就是类似 cout << ""这样的结果截获到mfc程序中而不需要对console程序进行修改 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以在启动的时候加入参数,譬如你要调用的控制台应用程序的名字是a.exe你就这样启动a >>1.txt然后你打开1.txt,里面就是所有的a.exe运行过程中产生的到控制台的输出。另外,好像也可以通过管道来解决,不过我不太清楚怎么干。 使用匿名管道,实现如下://声明变量HANDLE g_hForwardDoor;HANDLE g_hForwardExit;HANDLE g_hBackwardDoor;HANDLE g_hBackwardExit;//实现函数BOOL ConnectPipe( LPSTR pszExe ){ SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(sa); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; if( !CreatePipe( &g_hBackwardExit, &g_hBackwardDoor, &sa, 0 ) ) return FALSE; if( !CreatePipe( &g_hForwardExit, &g_hForwardDoor, &sa, 0 ) ) return FALSE; HANDLE hDummy = g_hForwardDoor; DuplicateHandle( GetCurrentProcess(), hDummy, GetCurrentProcess(), &g_hForwardDoor, 0, FALSE, DUPLICATE_SAME_ACCESS ); CloseHandle( hDummy ); PROCESS_INFORMATION pi; STARTUPINFO si; memset( &si, 0, sizeof(si) ); si.cb = sizeof(si); si.dwFlags = STARTF_USESTDHANDLES; si.hStdInput = g_hForwardExit; si.hStdOutput = g_hBackwardDoor; if( !CreateProcess(NULL, pszExe, NULL, NULL, TRUE, DETACHED_PROCESS, NULL, NULL, &si, &pi ) ) { AfxMessageBox("Create Process Failed!"); return FALSE; } if( pi.hProcess ) CloseHandle( pi.hProcess ); if( pi.hThread ) CloseHandle( pi.hThread ); return TRUE;}HGLOBAL GetOutput( void ){ HANDLE hMem; LPSTR lpMem; DWORD cbMem = 8192; DWORD cbSize = 0; CloseHandle( g_hBackwardDoor ); hMem = GlobalAlloc( GMEM_MOVEABLE, cbMem ); lpMem = (LPSTR)GlobalLock( hMem ); for(;;) { DWORD cbRead; BOOL fRes; fRes = ReadFile( g_hBackwardExit, lpMem + cbSize, cbMem - cbSize, &cbRead, NULL); if( fRes == FALSE || cbRead == 0 ) break; cbSize += cbRead; if( cbMem - cbSize < 8192 ) { cbMem += 8192; GlobalUnlock( hMem ); hMem = GlobalReAlloc( hMem, cbMem, GMEM_MOVEABLE ); lpMem = (LPSTR)GlobalLock( hMem ); } } lpMem[cbSize] = '\0'; GlobalUnlock( hMem ); CloseHandle( g_hBackwardExit ); return hMem;}//使用示例,供参考 CString strCommandLine("route print"); ConnectPipe(strCommandLine.GetBuffer(0)); HGLOBAL hMem = GetOutput(); LPSTR lpMem = (LPSTR)GlobalLock( hMem ); CString strOutput(lpMem); vc界面设计求助 从数据库中得到的长字符串如何再空间中换行 在debug和release下面都很正常的程序,用installshield打包,安装后运行,在特定情况下会出现Runtime error,咋搞? G.729可不可以在win2000下用vc6.0运行?如可以,具体怎么做? DAO中如何判断一个表是否存在啊? "!!!"关于Windriver生成的程序改写成Dll程序的问题? 关于位图初始化的问题? NURBS曲线拟合程序 请教一个sql语句长度的问题 CListCtrl的菜问题 我想在画新视图时,保持原来的视图。 在线急等!!!!!!
你就这样启动
a >>1.txt
然后你打开1.txt,里面就是所有的a.exe运行过程中产生的到控制台的输出。另外,好像也可以通过管道来解决,不过我不太清楚怎么干。
HANDLE g_hForwardDoor;
HANDLE g_hForwardExit;
HANDLE g_hBackwardDoor;
HANDLE g_hBackwardExit;//实现函数
BOOL ConnectPipe( LPSTR pszExe )
{
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL; if( !CreatePipe( &g_hBackwardExit, &g_hBackwardDoor, &sa, 0 ) )
return FALSE; if( !CreatePipe( &g_hForwardExit, &g_hForwardDoor, &sa, 0 ) )
return FALSE; HANDLE hDummy = g_hForwardDoor;
DuplicateHandle( GetCurrentProcess(), hDummy,
GetCurrentProcess(), &g_hForwardDoor, 0,
FALSE, DUPLICATE_SAME_ACCESS ); CloseHandle( hDummy ); PROCESS_INFORMATION pi;
STARTUPINFO si;
memset( &si, 0, sizeof(si) );
si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = g_hForwardExit;
si.hStdOutput = g_hBackwardDoor;
if( !CreateProcess(NULL, pszExe, NULL, NULL, TRUE,
DETACHED_PROCESS, NULL, NULL, &si,
&pi ) )
{
AfxMessageBox("Create Process Failed!");
return FALSE;
}
if( pi.hProcess )
CloseHandle( pi.hProcess );
if( pi.hThread )
CloseHandle( pi.hThread ); return TRUE;
}HGLOBAL GetOutput( void )
{
HANDLE hMem;
LPSTR lpMem;
DWORD cbMem = 8192;
DWORD cbSize = 0; CloseHandle( g_hBackwardDoor ); hMem = GlobalAlloc( GMEM_MOVEABLE, cbMem ); lpMem = (LPSTR)GlobalLock( hMem );
for(;;) {
DWORD cbRead;
BOOL fRes; fRes = ReadFile( g_hBackwardExit, lpMem + cbSize,
cbMem - cbSize, &cbRead, NULL);
if( fRes == FALSE || cbRead == 0 )
break; cbSize += cbRead; if( cbMem - cbSize < 8192 ) {
cbMem += 8192;
GlobalUnlock( hMem );
hMem = GlobalReAlloc( hMem, cbMem,
GMEM_MOVEABLE ); lpMem = (LPSTR)GlobalLock( hMem );
}
} lpMem[cbSize] = '\0'; GlobalUnlock( hMem ); CloseHandle( g_hBackwardExit );
return hMem;
}//使用示例,供参考
CString strCommandLine("route print");
ConnectPipe(strCommandLine.GetBuffer(0));
HGLOBAL hMem = GetOutput();
LPSTR lpMem = (LPSTR)GlobalLock( hMem );
CString strOutput(lpMem);