15,471
社区成员
发帖
与我相关
我的任务
分享
HANDLE ChildIn_Read, ChildIn_Write;
HANDLE ChildOut_Read, ChildOut_Write;
#define BUFSIZE 2048
UINT HReadConsole(LPVOID lpParam)
{
BOOL flag = 0;
while(true)
{
char buffer[BUFSIZE] = { 0 };
DWORD BytesRead;
//从子进程读入
try
{
flag = ReadFile(ChildOut_Read, buffer, BUFSIZE, &BytesRead, NULL);
}
catch(...)
{
TRACE(_T(""));
}
if(!flag || (BytesRead == 0)) break;
//输出到文件
TRACE(_T("%s\n"), buffer);
}
AfxEndThread(0);
return 0;
}
void Ccontrol_DemoDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
#if 1 //使用了匿名管道重定向的方法
SECURITY_ATTRIBUTES saAttr = { 0 };
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
//ChildIn_Write是子进程的输入句柄,ChildIn_Read是父进程用于写入子进程输入的句柄
CreatePipe(&ChildIn_Read, &ChildIn_Write, &saAttr, 0);
//设置子进程不能继承接收输入管道的另一端:ChildIn_Write
SetHandleInformation(ChildIn_Write, HANDLE_FLAG_INHERIT, 0);
//ChildOut_Write是子进程的输出句柄,ChildOut_Read是父进程用于读取子进程输出的句柄
CreatePipe(&ChildOut_Read, &ChildOut_Write, &saAttr, 0);
//设置子进程不能继承发送输出管道的另一端:ChildOut_Read
SetHandleInformation(ChildOut_Read, HANDLE_FLAG_INHERIT, 0);
STARTUPINFO StartupInfo = { 0 };
StartupInfo.cb = sizeof(STARTUPINFO);
//将标准输出和错误输出定向到我们建立的ChildOut_Write上
StartupInfo.hStdError = ChildOut_Write;
StartupInfo.hStdOutput = ChildOut_Write;
//将标准输入定向到我们建立的ChildIn_Read上
StartupInfo.hStdInput = ChildIn_Read;
//设置子进程接受StdIn以及StdOut的重定向
StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
PROCESS_INFORMATION ProcessInfo = { 0 };
BOOL bSuccess = CreateProcess(NULL, "F:\\Steam\\steamapps\\common\\Don't Starve Together Dedicated Server\\bin\\dontstarve_dedicated_server_nullrenderer.exe -console",
NULL, NULL, TRUE, NULL, NULL, "F:\\Steam\\steamapps\\common\\Don't Starve Together Dedicated Server\\bin", &StartupInfo, &ProcessInfo);
AfxBeginThread(HReadConsole,NULL);
CDialogEx::OnOK();
}