写一个程序,在主程序中调用执行自己编译成的可执行文件,想利用匿名管道在主程序与被调用的子程序中进行通信。
直白点说,就是A程序中调用B程序,在A中想获取B的输入输出,或者是错误信息。
  
  在《VC++深入详解》中看到匿名管道,父进程实现下,
        SECURITY_ATTRIBUTES sa;
sa.bInheritHandle=TRUE;
sa.lpSecurityDescriptor=NULL;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
if (!CreatePipe(&hRead,&hWrite,&sa,0))
{
MessageBox("创建匿名管道失败!");
return;
}
STARTUPINFO sui;
PROCESS_INFORMATION pi;
ZeroMemory(&sui,sizeof(STARTUPINFO));
sui.cb=sizeof(STARTUPINFO);
sui.dwFlags=STARTF_USECOUNTCHARS;
sui.hStdOutput=hWrite;
sui.hStdInput=hRead;
GetStartupInfo(&sui);
sui.hStdError=hWrite;
sui.hStdOutput=hWrite;
//sui.hStdInput=GetStdHandle(STD_INPUT_HANDLE);
//sui.hStdOutput=GetStdHandle(STD_OUTPUT_HANDLE); if (!CreateProcess("b.exe",NULL,NULL,
NULL,TRUE,DEBUG_PROCESS,NULL,NULL,&sui,&pi))
{
CloseHandle(hRead);
CloseHandle(hWrite);
hRead=NULL;
hWrite=NULL;
MessageBox("创建子进程失败!");
return;
}
else
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
MessageBox("子进程创建成功!");
}    程序运行时,可以顺利的创建子进程。 但是问题是:  b.exe是已经编译好的exe文件,前面
          sui.hStdError=hWrite;
          sui.hStdOutput=hWrite;
 调用执行b.exe文件时,是不是b.exe的输入输出与错误流  都写到管道里了?
  
 如果是,我调试程序的时候为什么出现异常了?
 (附上B.exe的一个简单例子)
  b.cpp:
     #include<iostream>
using namespace std;void main()
{
        cout<<"hello, world."<<endl;
int a,b;
while(cin>>a>>b)
   cout<<a+b<<endl;
}

解决方案 »

  1.   


     我b.exe文件中是要读入数据的,但是这数据流我不知道从哪里指定。  
    就算是我只让b.exe输出一条语句,程序执行时,我先创建进程,提示可以成功之后,再从管道里读取数据就没有响应了。
      

  2.   

    在b.exe中进行输出后 你还是主动刷新一下缓冲区。
    否则 父进程有可能得不到子进程的输出。
      

  3.   

    可以参考http://topic.csdn.net/u/20090209/22/515d88b5-5977-4754-9d3c-90391c3b47b1.html
      

  4.   

       
      不是很懂,你那里不是说对于已经链接生成的exe文件是无法刷新缓冲区的啊?
      

  5.   

    GetStartupInfo(&sui);去掉试试。
      

  6.   

    对, 如果无法刷新缓冲 那着实没有办法。
    你也不用找了
    MSDN对这个问题有描述的 大概意思也就是说会存在不能及时刷新缓冲的问题。
      

  7.   


       哦,没怎么用过,不怎么懂。    但是那天发现可以用system函数来对输入输出进行重定向,所以就用了system了,没用管道了。  system("type 2.txt | a.txe>1.txt");  让a.exe从2.txt输入数据,将输出结果保存到1.txt中。
      

  8.   


    你是这个需求呀
    问题不大
    即使是管道 
    当程序 a.exe 运行结束的时候 缓冲区会刷新的。
    你这样试试 就不用那个type命令了 system("a.exe <2.txt >1.txt");