简单 RT我创建了cmd进程, 将输出, 输入句柄重定向到两个管道中, 在输入管道中输入notepad, notepad进程被创建, 但却无法显示, 关闭cmd会话, notepad窗口才能跳出来 。、我想让notepad进程创建时就直接显示, 求解释, 求答案

解决方案 »

  1.   

    你怎么创建notepad进程的呢?贴代码~
      

  2.   


    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);
      

  3.   

    直接向 hWritePipe2 中写入 "notepad.exe/r/n"
      

  4.   


    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进程, 却无法显示窗口, 
      

  5.   

    si.hStdOutput = si.hStdError = hw1;
    -->
    si.hStdOutput = si.hStdError = hw2;
      

  6.   

    还有一个问题,你最后的所有的用到的HANDLE需要CloseHandle来关闭
      

  7.   

    应该是hw1 , VisualEleven再仔细看下, 不是这个问题, 
      

  8.   

    win32console app不行,创建win32 app就行了
      

  9.   

    跟 console 没没关系, 试过了, 不行, 倒是可能跟系统有关系, 因为在2008R2或者win7上就不存在该问题, 
      

  10.   

    不可能把, 你是什么系统, 我目前只发现, win7跟2008r2, 不存在这样的问题, 
      

  11.   

    xp     win32console-> win32