在程序中利用CreateProcess创建子进程,在子进程中调用另一个控制台程序,并利用“管道”技术重定向子进程中控制台程序与主进程间的输入、输出
CString strAccount;
GetDlgItemText(IDC_EDIT_IN,strAccount);
if (strAccount.IsEmpty())
{
MessageBox("请先输入要授权的账号!","提示",MB_OK|MB_ICONWARNING);
}
else
{
CString strIn;
CString strNum;
for (int i=0;i<strAccount.GetLength();i++)
{
if (i%2 == 0)
{
strNum=strAccount.Mid(i,1);
strIn+=strNum;
}
}
PROCESS_INFORMATION pi={0};
HANDLE hPipeOutputRead=NULL;
HANDLE hPipeOutputWrite=NULL;
HANDLE hPipeInputRead=NULL;
HANDLE hPipeInputWrite=NULL;
BOOL bTest;
DWORD dwNumberOfBytesRead=0;
DWORD dwNumberOfBytesWrite=0;
char* sIn;
sIn=strIn.GetBuffer(strIn.GetLength());
strIn.ReleaseBuffer();
CHAR szMsg[100];
memset(szMsg,0,sizeof(szMsg));
CHAR szBuffer[256];
memset(szBuffer,0,sizeof(szBuffer));
//创建管道
SECURITY_ATTRIBUTES sa={0};
sa.nLength = sizeof(sa);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
//为标准输出重定向创建管道
CreatePipe(&hPipeOutputRead, // read handle
&hPipeOutputWrite, // write handle
&sa, // security attributes
0 // number of bytes reserved for pipe - 0 default
);
//为标准输入重定向创建管道
CreatePipe(&hPipeInputRead, // read handle
&hPipeInputWrite, // write handle
&sa, // security attributes
0 // number of bytes reserved for pipe - 0 default
);
//创建进程
//使子进程使用hPipeOutputWrite作为标准输出使用hPipeInputRead作为标准输入,并使子进程在后台运行
STARTUPINFO si = {0};
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdInput = hPipeInputRead;
si.hStdOutput = hPipeOutputWrite;
si.hStdError = hPipeOutputWrite;
CreateProcess ("./tool/111.exe", NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
//创建子进程后句柄已被继承,为了安全应该关闭它们
CloseHandle(hPipeOutputWrite);
CloseHandle(hPipeInputRead);
sprintf(szMsg,"%s\n",sIn);
WriteFile(
hPipeInputWrite, // handle of the write end of our pipe
&szMsg, // address of buffer that send data
strlen(szMsg), // number of bytes to write
&dwNumberOfBytesWrite,// address of number of bytes read
NULL // non-overlapped.
);
CString strData;
while(1)
{
bTest=ReadFile(
hPipeOutputRead, // handle of the read end of our pipe
&szBuffer, // address of buffer that receives data
sizeof(szBuffer), // number of bytes to read
&dwNumberOfBytesRead, // address of number of bytes read
NULL // non-overlapped.
);
if (bTest){
szBuffer[dwNumberOfBytesRead] = 0; // null terminate
CString strMsg;
strMsg.Format("%s",szBuffer);
strData+=strMsg;
}
else
{
break;
}
}
CString strOut;
AfxExtractSubString(strOut,strData,2,'\r\n');
SetDlgItemText(IDC_EDIT_OUT,strOut);
WaitForSingleObject (pi.hProcess, INFINITE);
//关闭剩余的句柄
CloseHandle(pi.hProcess);
CloseHandle(hPipeOutputRead);
CloseHandle(hPipeInputWrite);
MessageBox("Step1已完成,请执行Step2!","提示",MB_OK);
}