简单 RT我创建了cmd进程, 将输出, 输入句柄重定向到两个管道中, 在输入管道中输入notepad, notepad进程被创建, 但却无法显示, 关闭cmd会话, notepad窗口才能跳出来 。、我想让notepad进程创建时就直接显示, 求解释, 求答案
简单 RT我创建了cmd进程, 将输出, 输入句柄重定向到两个管道中, 在输入管道中输入notepad, notepad进程被创建, 但却无法显示, 关闭cmd会话, notepad窗口才能跳出来 。、我想让notepad进程创建时就直接显示, 求解释, 求答案
BOOL ret;
SECURITY_ATTRIBUTES sa;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor=0;
sa.bInheritHandle=TRUE; ret = CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0);
if (!ret)
{
return FALSE;
}
ret=CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0);
if (!ret)
{
return FALSE;
} STARTUPINFO si;
ZeroMemory(&si,sizeof(si));
GetStartupInfo(&si);
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
si.wShowWindow = SW_SHOWNORMAL;
si.lpDesktop = _T("WinSta0\\Default"); //创建进程且重定向标准输入输出 //将其标准输入设置为hReadPipe2
//将其标准输出和错误输出设置为hWritePipe1
si.hStdInput = hReadPipe2;
si.hStdOutput = si.hStdError = hWritePipe1; TCHAR cmdLine[] = _T("cmd.exe /k cmd");
TCHAR path[MAX_PATH] = {0};
ret = SHGetSpecialFolderPath(NULL,path,CSIDL_PROFILE,0);
if (ret != TRUE)
{
//通过环境变量去取
ExpandEnvironmentStrings(_T("%USERPROFILE%"), path, MAX_PATH);
} HANDLE hToken;
if(!CClientMgrEventReceiver::GetTokenByName(hToken,_T("EXPLORER.EXE")))
{
OutputDebugString(_T("RunProcess-GetTokenByName--EXPLORER.EXE is wrong=>return false"));
return FALSE;
} BOOL bResult = CreateProcessAsUser(hToken,NULL,cmdLine,NULL,NULL,TRUE,0,NULL,path,&si,&pi); CloseHandle(hToken);
bool test()
{
HANDLE hr1 = 0 ;
HANDLE hw1 = 0 ;
HANDLE hr2 = 0 ;
HANDLE hw2 = 0;
SECURITY_ATTRIBUTES sa;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor=0;
sa.bInheritHandle=TRUE;
if( !CreatePipe( &hr1 , &hw1 , &sa ,0) )
return false;
if( !CreatePipe( &hr2 , &hw2 , &sa ,0) )
return false; STARTUPINFO si;
ZeroMemory(&si,sizeof(si));
GetStartupInfo(&si);
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
si.wShowWindow = SW_SHOWNORMAL;
si.lpDesktop = _T("WinSta0\\Default");
si.hStdInput = hr2;
si.hStdOutput = si.hStdError = hw1; PROCESS_INFORMATION pi;
TCHAR cmdLine[] = _T("cmd.exe /k cmd");
TCHAR path[MAX_PATH] = {0};
ExpandEnvironmentStrings(_T("%USERPROFILE%"), path, MAX_PATH); bool ret = CreateProcess(NULL,cmdLine,NULL,NULL,TRUE,0,NULL,path,&si,&pi); string str = "notepad\r\n";
DWORD lBytesWrite;
if (!WriteFile(hw2,(LPCVOID)str.c_str(),str.length(),&lBytesWrite,NULL))
return false;
else return true;
}int main(int argc, char * argv[])
{
test();
return 0;
}按照如上代码可以创建notepad进程, 却无法显示窗口,
-->
si.hStdOutput = si.hStdError = hw2;