写一个程序,在主程序中调用执行自己编译成的可执行文件,想利用匿名管道在主程序与被调用的子程序中进行通信。
直白点说,就是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;
}
解决方案 »
- GetClientRect为什么不能放在视图构造函数里
- 对话框的状态栏问题
- 文件传输厚CFILE写入的问题
- 请问这个用了什么样的技术?谢谢
- 如何判断double型变量没有被主动赋值,并使用insert语句插入null到数据库中。
- 爱人怀孕了,散分顺便接受点大家的祝福
- 请教高手,如何捕获原始MAC帧?谢谢!
- VCM 问题! 如何设置DIXV或者MP42编解码器的属性呢!?
- 执行程序的时候显示“应用程序无法启动,配置不正确”怎么办?
- vc调试设置问题
- 初学者对线程同步问题的一点疑问,还望高手解答(重发,刚才的帖子找不到页面)。
- 子类构造函数中调用父类带参的构造函数,而实际却调用父类默认构造函数,请问各位这是为何?????
我b.exe文件中是要读入数据的,但是这数据流我不知道从哪里指定。
就算是我只让b.exe输出一条语句,程序执行时,我先创建进程,提示可以成功之后,再从管道里读取数据就没有响应了。
否则 父进程有可能得不到子进程的输出。
不是很懂,你那里不是说对于已经链接生成的exe文件是无法刷新缓冲区的啊?
你也不用找了
MSDN对这个问题有描述的 大概意思也就是说会存在不能及时刷新缓冲的问题。
哦,没怎么用过,不怎么懂。 但是那天发现可以用system函数来对输入输出进行重定向,所以就用了system了,没用管道了。 system("type 2.txt | a.txe>1.txt"); 让a.exe从2.txt输入数据,将输出结果保存到1.txt中。
你是这个需求呀
问题不大
即使是管道
当程序 a.exe 运行结束的时候 缓冲区会刷新的。
你这样试试 就不用那个type命令了 system("a.exe <2.txt >1.txt");