双管道(CreatePipe)与本地cmd.exe进程通信(附源代码及编译好的程序,免费下载)

双管道(CreatePipe)与本地cmd.exe进程通信(附源代码及编译好的程序,免费下载)源代码:#include<stdio.h>#include<WINDOWS.H>#defineSEND_BUFF_SIZE1024//实现去除执行结果中的”命令\n”voidprint(char*cmdstr){ while(*((char*)cmdstr++)!=’\n’); printf(cmdstr);}intmai…

大家好,又见面了,我是你们的朋友全栈君。

简介:

在本地,用父进程创建一个cmd.exe子进程,这个子进程的输入输出被重定向到两条匿名管道,从而实现与父进程通信。父进程输入命令到一条管道,子进程读取后执行并输出到另一条管道,父进程读取后输出到窗口。
此版本源代码借鉴并修改、优化了前人的创作,详见:https://blog.csdn.net/aq782645210/article/details/16370409 中的评论

源代码:

#include <stdio.h>
#include <WINDOWS.H>
#define SEND_BUFF_SIZE 1024
 
//实现去除执行结果中的 "命令\n"
void print(char *cmdstr)
{ 
   
	while(*((char*)cmdstr++)!='\n');
	printf(cmdstr);
}
 
 
 
int main()
{ 
   
	HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2; //四个HANDLE 用来创建两个管道
	CHAR Buff[SEND_BUFF_SIZE] = { 
   0};
    CHAR sendBuff[SEND_BUFF_SIZE] = ("dir \n");
 
	//安全属性的东西
    SECURITY_ATTRIBUTES sa;
    sa.nLength=sizeof(sa);
    sa.lpSecurityDescriptor=0;
    sa.bInheritHandle=true;    
    int ret;
	
    if(!CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0))//创建两个匿名管道,以改变DOS的标准输入输出
    { 
   
        return -1;
    }
    if(!CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0))
    { 
   
        return -1;
    }
	
	//启动信息
    STARTUPINFO si;
    ZeroMemory(&si,sizeof(si));
    //GetStartupInfo(&si);
    si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
    si.wShowWindow = SW_HIDE;
    si.hStdInput = hReadPipe2;
    si.hStdOutput = si.hStdError = hWritePipe1;
	
    char cmdLine[256] = { 
   0};
    GetSystemDirectory(cmdLine,sizeof(cmdLine));
    strcat(cmdLine, ("\\cmd.exe"));
	
    PROCESS_INFORMATION ProcessInformation;
    if(CreateProcess(cmdLine,NULL,NULL,NULL,TRUE,0,NULL,NULL,&si,&ProcessInformation) == 0)
    { 
   
        return -1;
    }
	
 
    unsigned long lBytesRead,lBytesWrite;//存放实际读写字节的变量
	
	while(TRUE){ 
   
		lBytesRead=0;
		Sleep(50);//等待cmd程序执行
		ret=PeekNamedPipe(hReadPipe1,Buff,SEND_BUFF_SIZE,&lBytesRead,0,0);//管道是否有数据可读
		if(lBytesRead)    
		{ 
   
            //第一次可以读到cmd的初始化信息
            ret=ReadFile(hReadPipe1,Buff,SEND_BUFF_SIZE,&lBytesRead,0);//读取管道里的数据
            //如果读到数据,则对数据进行下一步处理
			print(Buff);
			ZeroMemory(Buff,sizeof(Buff));	
		}
		else{ 
   //管道中无数据时输入命令,以回车结束
			
			char ch;
			int count=0;
			ZeroMemory(sendBuff,sizeof(sendBuff));
			while((ch=getchar())!='\n')
			{ 
   
				sendBuff[count]=ch;
				count++;
			}
			sendBuff[count++]='\n';

			if(!WriteFile(hWritePipe2, sendBuff,count,&lBytesWrite,0))//写入数据 
			{ 
   
				printf("WriteFile Error!!\n");
				return -1;
			}
			//等待cmd程序执行
			Sleep(100);
		}
	}
    
}

编译好的程序:

https://pan.baidu.com/s/1VUtnTyqMHnv588RcJweohQ

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159423.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • DropDownList的常用属性和事件「建议收藏」

    DropDownList的常用属性和事件「建议收藏」SelectedItem属性设置或获取下拉菜单的选中项,该属性的类型为System.Web.UI.WebControls.ListItem.所有列表控件(ListControl)中的项都是该类型,它

    2022年7月3日
    56
  • 算法-分治法

    算法-分治法

    2022年3月12日
    52
  • Python暴力激活成功教程wifi密码

    Python暴力激活成功教程wifi密码今天给大家分享一个使用Python激活成功教程WiFi密码的代码,这个代码也是非常简单,这里需要用Python中的pywifi这个库,所以需要在DOS命令下安装这个库,同样使用pipinstallpywifi,很简单就安装成功了,我用的是Python3,所以各位看的时候需要注意这一点。接下来我们一步一步分析主要代码,后面同样附上完整的代码。对了,需要注意一点,就是电脑必须是要用无线网卡的。首先我们…

    2022年8月22日
    6
  • Java基础知识学习笔记-12.1(待续)

    Java基础知识学习笔记-12.1(待续)

    2021年10月6日
    45
  • Linux中搭建Nginx环境[通俗易懂]

    Linux中搭建Nginx环境[通俗易懂]CentOs7环境中一、安装pcre依赖 1.下载 本地上传或者联网下载pcre压缩文件依赖 2. 解压pcre压缩包 命令:tar -zxvf pcre-8.37.tar.gz 3. 在解压目录下执行 ./configure 在当前目录运行configure文件 …

    2022年6月13日
    30
  • Oracle函数之LAG函数[通俗易懂]

    Oracle函数之LAG函数[通俗易懂]语法使用方法  LAG是一个分析函数。它可以在不使用自连接的情况下同时访问到一个表的多行数据。给一个或多个列名和一个游标位置(位移),LAG可以访问当前行之前的行,行之间间隔的行数为位移值。  语法树中的offset(位移)参数是可选的,可以指定一个大于0的整数,如果不指定offset(位移)参数函数会默认位移为1。语法树中的default值也是可选的,这个default值是当位移值超过查…

    2025年8月27日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号