从匿名管道谈重定向技术

news/2024/12/23 17:22:31/文章来源:https://blog.csdn.net/wbly0/article/details/115456

                                 匿名管道与重定向技术
 正文
    首先我们得理解一个定义:重定向
何谓重定向?可以先字面理解为:重新决定方向!在控制台程序中,将标准的输入、输出句柄用管道的读、写句柄替换,而控制台程序本身并不知道它的输入、输出句柄已发生了变化,它依然将相关句柄(实为管道的读写句柄)作为标准的输入、输出句柄来看待。当父进程和子进程进行数据通信时的情形是这样的:父进程将标准的输出端重定向匿名管道的写句柄,启动子进程,因为继承关系,子进程也具有了这一特点,它的标准输出也与管道的写句柄联系在一起了。此时的父进程在关闭管道写句柄之后(一定要关闭),就可以通过读句柄来取得子进程发出的数据了。
   为了说明这个实事,我小举一例子,说明如何在图形界面中调用控制台的标准输出。程序运行的结果如下图:

程序按如下步骤实现:

1、新建一对话框CMyGUIDlg, 再加入一编辑框,设置好编辑框的属性(多行,水平&&垂直滚动条,自滚动,want return)ID号为:IDC_EDIT1
在ClassWizard中为IDC_EDIT1加入一CEdit型变量。

CEdit m_edit1;

2、加入一工作线程,函数可以为全局,当然也可以作为static型的类成员。我们选择后者。
   static UINT TestThread(LPVOID p);

3、在OnOK()消息处理函数中,加入如下代码:

void CMyGUIDlg::OnOK()
{

    AfxBeginThread(TestThread, this);
    UpdateData(TRUE);
}

4、在线程函数我们加入如下代码:
UINT CMyDUIDlg::TestThread(LPVOID p)
{
 STARTUPINFO si;
 PROCESS_INFORMATION pi;
 // 管道读句柄
 HANDLE hRead;
 // 管道写句柄
 HANDLE hWrite;
 
 SECURITY_ATTRIBUTES saAttr;
 saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
 saAttr.lpSecurityDescriptor = 0;
 saAttr.bInheritHandle = true;
 
 // 创建匿名管道
 if(!CreatePipe(&hRead, &hWrite, &saAttr, 0))
 {
  AfxMessageBox("创建管道失败!");
  return 0;
 }
  // 得到本进程的当前标准输出
  // HANDLE hTemp = GetStdHandle(STD_OUTPUT_HANDLE);
 
  // 设置标准输出到匿名管道
  // SetStdHandle(STD_OUTPUT_HANDLE, hWrite);
 
 si.cb = sizeof(STARTUPINFO);
 GetStartupInfo(&si); // 获取本进程的STARTUPINFO结构信息
 si.hStdError = hWrite;
 si.hStdOutput = hWrite;
 si.wShowWindow = SW_HIDE;
 si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; // 让子进程隐藏、标准输出生效
 
 CString strLine;
 strLine.Format("cl -h %d /?", (unsigned int)hWrite); // 命令行参数
// 创建子进程
 if (!CreateProcess(NULL, (LPSTR)(LPCTSTR)strLine, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))
 {
    AfxMessageBox("创建子进程失败!");
    return 0;
 }
 
 // 恢复本进程的标准输出
 // SetStdHandle(STD_OUTPUT_HANDLE, hTemp);

 CloseHandle(hWrite);   // 关闭写句柄(一定要关闭)
 CString strOut;
 char ReadBuf[100] = {0};
 DWORD dwRead;
 // 读管道直至管道关闭
 while (ReadFile(hRead, ReadBuf,99, &dwRead, NULL))
 {
  strOut += ReadBuf;
  memset(ReadBuf, 0, 99); 
 }
 CMyDUIDlg* plg = (CMyDUIDlg*)p;
 plg->m_edit1.SetWindowText(strOut);
 plg->InvalidateRect(NULL);

 CloseHandle(hRead);
 
 return 0;
}


作如下说明:
 1、本程序调用的控制台输出是VC++中的cl.exe运行的结果。当然你也可以自己加入一些控制台的 测试程序,将strLine赋值你想测试的控制台程序名即可。
 2、此程序在XP+VC6中测试通过。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/64342.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文了解转发与重定向

一文了解转发与重定向 🏠个人主页:不会写代码的满满 🧑个人简介:大家好,我是满满,一个想要与大家共同进步的男人😉😉 目前状况🎉:开学即将大三,目…

转发与重定向

转发是服务器行为,重定向是客户端行为。转发耗时比重定向少。 转发——>客户浏览器发送HTTP请求——>web服务器接受请求——>调用内部一个方法在容器内部完成请求处理和转发动作——>再将转发跳转到的那个网页资源返回给客户; 转发只能在同…

将您重定向的次数过多什么意思_Linux重定向

通常说所重定向便是将命令结果如查询结果重定向到一个文件中,通常用在一些命令结果较多无法完全显示完,可以重定向到一个文件,在文件中查看。 重定向分为输入重定向<和输出重定向> 一、>和>> 区别:>是重定向到一个文件;>>追加内容到一个文件 如果…

API接口案例,淘宝商品详情数据采集

item_get-获得商品详情 API接口工具 请求参数 请求参数&#xff1a;num_iid520813250866&is_promotion1参数说明&#xff1a;num_iid:淘宝商品ID is_promotion:是否获取取促销价 Request address: https://api-gw.onebound.cn/taobao/item_get_app/?keyt& &num…

API数据接口该怎么对接

随着互联网和移动互联网的发展&#xff0c;API&#xff08;Application Programming Interface&#xff09;接口的作用越来越重要。API接口将各种平台相互连接&#xff0c;使得不同系统的信息可以互相获取和使用&#xff0c;大大提高了系统的互操作性和开发效率。本文将介绍如何…

如何实现高质量的系统数据对接/API接口整合集成方案?

我们建立一个数字化系统可能会有跟别的系统进行数据对接的需要&#xff0c;而别人的数字化系统也有可能需要跟我们的系统进行数据对接&#xff0c;也可能我们开发了不同的网站&#xff0c;网站小应用之间需要进行数据对接。那么数据对接应该如何操作呢&#xff1f;怎么才能更好…

以聚合数据为例,详细说明API接口使用方法

前言 以聚合数据为例&#xff0c;详细说明API接口使用细节方法&#xff0c;说明清楚如何使用API接口的每个步骤&#xff0c;防止以后忘记没地方找。 API网站注册后最重要的个人数据是请求key值&#xff0c;每个不同的数据都有与之对应的请求key值&#xff0c;这里我拿新…

举例说明如何使用【聚合数据】的API接口

更新&#xff1a;这篇文章写于2016年8月&#xff0c;现在的聚合数据可能有些变化&#xff0c;申请使用的方式相应有所改变&#xff0c;所以本文只作参考. ________________________________________________________________________________________________________________…

企业微信增加企业内部应用入口的超链接

背景 2020年初,新冠疫情导致很多企业远程办公,接到许多方便员工移动办公的开发需求.比如最近接到一个任务,是需要再企业微信的工作台台添加一个超链接,连接到企业已经有的一个web项目上去.并且能够携带用户信息进行访问. 放超链接很简单,复杂的是如何携带用户信息到这个超链接…

企业微信url及生成授权链接

企业微信第三方开发课程 14-18 一、简介 这里主要分为四部分&#xff0c;验证 url 有效性、完成用户的测试安装、获取生成预授权码、生成授权安装链接。这几部就可以完成第三方有用的回调和安装&#xff0c;这也是后续功能开发的基础。 二、Get 请求验证 URL 有效性 1.为什…

对接企业微信3:网页授权登录

构造网页授权链接 如果企业需要在打开的网页里面携带用户的身份信息&#xff0c;第一步需要构造如下的链接来获取code参数&#xff1a; https://open.weixin.qq.com/connect/oauth2/authorize?appidCORPID&redirect_uriREDIRECT_URI&response_typecode&scopesnsa…

企业微信-构造网页授权链接实现登录

文档地址&#xff1a;构造网页授权链接 - 接口文档 - 企业微信开发者中心 注意&#xff1a; 1.redirect_uri&#xff1a;回调链接地址&#xff0c;需要使用urlencode对链接进行处理 2.scope&#xff1a;如果需要获取成员的头像、手机号等信息需要设为snsapi_privateinfo 例如前…

windows浏览器无法访问虚拟机上Linux部署的consul

一、问题&#xff1a; 查看consul服务 是启动的&#xff0c;但是就是无法访问。 二、解决步骤&#xff1a; 1、查看防火墙是否关闭或者添加接口映射 关闭防火墙&#xff08;具体看应用场景&#xff0c;请不要盲目的操作&#xff09; systemctl stop firewalld 查看防火墙状…

插件部署环境

插件部署环境 前言 按照前面的文章已经安装好了同步工具&#xff0c;那么在使用之前&#xff0c;我们需要为同步工具做一些准备工作&#xff0c;插件才能正常使用 准备工作 准备工作主要两点&#xff0c;许可&#xff0c;金蝶环境配置 许可试用 插件一共提供四种许可方式…

RabbiteMQ 部署到虚拟机的 Linux 上,加入插件后,无法通过浏览器访问 RabbiteMQ 控制台

解决办法&#xff1a; 可以通过安装 docker 容器&#xff0c;在 docker 容器上面安装 RabbiteMQ 解决。 具体操作如下&#xff1a; 1.先安装 docker 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken更新本地镜像源&#xff1a; …

量化交易入门--写第一个量化程序

一位量化交易程序员手把手教你入门 上篇介绍完了如何配置量化交易所需要的环境&#xff0c;这篇继续介绍如何写第一个量化交易程序。 MT4提供的sample程序只有基本的功能&#xff0c;不能够自动交易。 我们写一个自动交易程序&#xff0c;逻辑如下 下一个多单 检查当前盈…

《PyTorch深度学习实践》

【《PyTorch深度学习实践》完结合集】 https://www.bilibili.com/video/BV1Y7411d7Ys/?share_sourcecopy_web&vd_source684aec3a42a2952834511895317ee34b 链接&#xff1a;https://pan.baidu.com/s/1vZ27gKp8Pl-qICn_p2PaSw 提取码&#xff1a;cxe4 一、&#xff08;学习…

C++_开发图形界面_EasyX(笔记)

笔记目录 前言一、为什么使用EasyX二、搭建EasyX图形开发环境三、测试EasyX图形开发环境1.绘制圆2.用ChatGpt测试EasyX的Y轴朝向 三、图形开发进阶四、黑客攻击系统界面总结 前言 Rock老师 ; C ; EasyX ; 笔记 一、为什么使用EasyX 1.辅助学习和提高C的工具 2.开发简单的图形…

吴恩达机器学习作业二Python实现

作业二 文章目录&#xff08;嫌墨迹可以直接点击目录跳转到源代码查看&#xff09; 文章目录 作业二第一题1.1 数据可视化代码讲解结果 1.2 实现1.2.1 热身运动 sigmoid 函数代码 1.2.2 损失函数和梯度代码结果思路 1.2.3 手动梯度下降尝试学习参数代码结果总结 1.2.3 使用fm…

chatgpt赋能python:Python出不来图像如何解决?——Python编程经验分享

Python出不来图像如何解决&#xff1f;——Python编程经验分享 Python是一门非常强大的编程语言&#xff0c;常用于数据处理、Web后端开发、爬虫等领域&#xff0c;但有时候在开发过程中&#xff0c;你可能会遇到Python出不来图像的情况。这时候该怎么办呢&#xff1f;本文将从…