双管道(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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 大数据面试题——HBase面试题总结

    大数据面试题——HBase面试题总结1、HBase的特点是什么?1)大:一个表可以有数十亿行,上百万列;2)无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;3)面向列:面向列(族)的存储和权限控制,列(族)独立检索;4)稀疏:空(null)列并不占用存储空间,表可以设计的非常稀疏;5)数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳;6)数据类型单一:Hbase中的数据都是字符串,没有类型。2…

    2022年5月31日
    33
  • LockWorkStation in Windows 9X/ME/NT/2000

    LockWorkStation in Windows 9X/ME/NT/2000LockWorkStationinWindows9X/ME/NT/2000代码作者:Delphiscn(cnBlaster#sohu.com)http://blog.csdn.net/delphiscn程序原码:http://blog.csdn.net/delphiscn/archive/2005/06/25/403157.aspx在线下载:http://de1phiscn.bokee….

    2022年7月21日
    15
  • word2019卡死_word2019卡顿严重

    word2019卡死_word2019卡顿严重解决WORD2019使用卡顿问题第一步:第二步:第三步:第四步:974)]第四步:

    2025年10月27日
    2
  • 怎样在pycharm中安装torch

    怎样在pycharm中安装torch1.方法一:首先尝试如下办法Pytorch安装及使用(Pycharm版)_OTip的博客-CSDN博客_pycharm安装pytorch2.方法二:其次尝试第二种办法windows中在pycharm中安装pytorch_垃圾就应该待在垃圾桶里的博客-CSDN博客_pycharm怎么安装pytorch3.方法三:最后尝试第三种方法torch包在pycharm里面的导入问题_木槿的世界-CSDN博客…

    2022年8月26日
    15
  • Plugin “GsonFormat“ is incompatible (supported only in IntelliJ IDEA).报错

    Plugin “GsonFormat“ is incompatible (supported only in IntelliJ IDEA).报错

    idea 2021年10月2日
    71
  • javawebservice_java web 框架

    javawebservice_java web 框架下面分别介绍一个这几种WebService框架的基本概念1、JWS是Java语言对WebService服务的一种实现,用来开发和发布服务。而从服务本身的角度来看JWS服务是没有语言界限的。但是Java语言为Java开发者提供便捷发布和调用WebService服务的一种途径。2、Axis2是Apache下的一个重量级WebService框架,准确说它是一个WebServices/SOAP/…

    2022年9月21日
    2

发表回复

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

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