问题现象:在界面的输入框输入命令。通过管道把命令传送给cmd.exe,执行完后,结果在由管道传送到界面显示。如果是执行
          ping,dir,cd等命令时,正常没有问题。当只想calc,write命令时,问题出现了,第一次输入时,没有任何反应,当再次输入时,执行的是第一次输入的命令。如,第一次输入calc不会有反应,当第二次执行行,才蹦出计算器的界面。write命令也是一样。不知是什么原因

解决方案 »

  1.   

    不好确定你的问题,给你一段代码吧,
    void function()
    {
    HANDLE   hSTDINWrite, hSTDINRead;       // 用于重定向子进程输入的句柄   
    HANDLE   hSTDOUTWrite, hSTDOUTRead;     // 用于重定向子进程输出的句柄   
    SECURITY_ATTRIBUTES   sa;   
        
    sa.bInheritHandle = TRUE;   
    sa.lpSecurityDescriptor = NULL;   
    sa.nLength = sizeof(sa);   // 创建子进程输出匿名管道   
    if( !CreatePipe(&hSTDOUTRead, &hSTDOUTWrite, &sa, 0) )   
    {   
    AfxMessageBox("Create   STDOUT   pipe   failed");   
    return;   
    }  // 创建子进程输入匿名管道   
    if( !CreatePipe(&hSTDINRead, &hSTDINWrite, &sa, 0) )   
    {   
    AfxMessageBox("Create   STDIN   pipe   failed");   
    return;   
    }
    (发表于2006-8-27 20:50:00)robin_fox_nan: PROCESS_INFORMATION  pi;   
    ZeroMemory(&pi, sizeof(pi));   
    STARTUPINFO  si; 
    GetStartupInfo(&si);si.cb = sizeof(STARTUPINFO);
        si.dwFlags = STARTF_USESTDHANDLES   |   STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;
    si.hStdInput   =   hSTDINRead;      //重定向子进程输入   
        si.hStdOutput   =   hSTDOUTWrite;   // 重定向子进程输入    
    si.hStdError = hSTDOUTWrite; //GetStdHandle( STD_ERROR_HANDLE ); char cmd[20] = {0, };
    ::strcpy(cmd, "c:\\fport.exe");if( !::CreateProcess(NULL, cmd, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi) )   
    {   
    int errorNo = ::GetLastError();
    AfxMessageBox("create process failed");   
    return;   
    }
    (发表于2006-8-27 20:51:00)robin_fox_nan:::CloseHandle(hSTDOUTWrite);   
    ::CloseHandle(hSTDINRead);char strData[1024] = {0, };
    DWORD dwBytes;
    while(::ReadFile(hSTDOUTRead, strData, sizeof(strData), &dwBytes, NULL))
    {   
    strData[dwBytes] = '\0';
    SetMessage(strData);
    }   ::WaitForSingleObject(pi.hProcess, INFINITE);   
    ::CloseHandle(hSTDOUTRead);   
    ::CloseHandle(hSTDINWrite);   
    ::CloseHandle(pi.hProcess);   
    ::CloseHandle(pi.hThread);  
    }// end of function