总结两种创建匿名管道来截获控制台命令的方法
来源:互联网 发布:淘宝旗舰店如何开 编辑:程序博客网 时间:2024/06/05 18:43
第一种为FILE *_popen( const char *command, const char *mode); 第一个参数直接传命令,返回端直接为管道的句柄,用fget来提取文件信息。
贴出关键代码:
WideCharToMultiByte(CP_ACP, 0, strCmmdLine.GetBuffer(), strCmmdLine.GetLength(), path, MAX_PATH-1, NULL, NULL);
//注意,命令行参数必须为ASCII字符
if( (child_output = _popen(path, "rt" )) == NULL )
return 1;
while(!feof( child_output ) )
{
if( fgets( psBuffer, 1023, child_output ))
{
// 将子进程的标准输出写入管道,提供给自己的父进程
// 格式是先写数据块长度(0表示结束),再写数据块内容
pInfo->strRes += psBuffer;
}
}
// 写“0”表示所有数据都已写完
return _pclose( child_output );
第二种较为复杂,但设置上可有多种选择,如开启子进程后可选择将子进程隐藏显示
创建管道原型函数,目的就是开启一个匿名管道,同时获取到管道的读写句柄
BOOL WINAPI CreatePipe( __out PHANDLE hReadPipe, __out PHANDLE hWritePipe, __in LPSECURITY_ATTRIBUTES lpPipeAttributes, __in DWORD nSize);
传命令行函数
CreateProcess()
关键代码:
SECURITY_ATTRIBUTES saAttr;
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE; //注意,这一行一定要为TRUE,子进程可以继承句柄设置
saAttr.lpSecurityDescriptor = NULL;
if(!CreatePipe(&(pInfo->hRead), &(pInfo->hWrite),&saAttr,0))
{
return 1;
}
STARTUPINFO siStartInfo;
GetStartupInfo(&siStartInfo); //通过这个函数省了不少事
siStartInfo.hStdOutput = pInfo->hWrite; //设置输出句柄
siStartInfo.hStdError = pInfo->hWrite; //设置错误句柄
siStartInfo.cb = sizeof(STARTUPINFO); //设置大小
siStartInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
siStartInfo.wShowWindow = SW_HIDE;
PROCESS_INFORMATION piProcInfo;
ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );
CString strCmmdLine;
strCmmdLine = "E:\\TestLoad.exe ";
CreateProcess(NULL, //第一个参数可为空,
strCmmdLine.GetBuffer(),
NULL, // process security attributes
NULL, // primary thread security attributes
TRUE, // handles are inherited
0, // creation flags
NULL, // use parent's environment
NULL, // use parent's current directory
&siStartInfo, // STARTUPINFO pointer
&piProcInfo); // receives PROCESS_INFORMATION
char buf[1024] = {0};
DWORD len;
CloseHandle(pInfo->hWrite); //注意,一定要在本端关闭句柄,否则子进程无法进行写操作
while(ReadFile(pInfo->hRead, buf, 1023, &len, NULL))
{
pInfo->strRes += buf;
}
- 总结两种创建匿名管道来截获控制台命令的方法
- 使用Aspect中的annotation标签的方法来截获所有的Exception,进行控制台打印
- VC 匿名管道获取控制台程序的输出
- CreatePipe()等函数创建管道来操纵控制台
- VC的匿名管道学习笔记总结
- 获取控制台输入的两种方法
- 个人总结:创建快捷方式的两种方法
- 匿名内部类创建线程的两种方式
- 匿名管道实现获取控制台程序输出
- 匿名管道、命令管道、管道容量以及管道组织方式
- 匿名管道的四种特殊情况
- 匿名管道的四种情况
- 匿名管道的使用
- C# 2.0:使用匿名方法、迭代程序和局部类来创建优雅的代码
- C# 2.0:使用匿名方法、迭代程序和局部类来创建优雅的代码
- C# 2.0:使用匿名方法、迭代程序和局部类来创建优雅的代码
- C# 2.0:使用匿名方法、迭代程序和局部类来创建优雅的代码
- C# 2.0:使用匿名方法、迭代程序和局部类来创建优雅的代码
- linux 重启命令
- 【Silverlight】Bing Maps开发应用与技巧一:地图打点与坐标控件(CoordControl)
- 《计算机教育》专题报道:“米老师”其人
- extjs使利用cookie换皮肤,华丽转身!
- 亲和串
- 总结两种创建匿名管道来截获控制台命令的方法
- jdbc 可更新结果集
- 在ASP.NET中实现ajax
- 继扎扎之后 苹果CEO入驻图片社交网站The Fancy
- hibernate学习
- const和static区别
- httpclient4 中文版帮助文档,最新官方版翻译版(一)
- 暑假个人赛3 A题
- 《计算机教育》专题报道:“狼”来了:十名提高班毕业生寄语