• 大小: 265KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-07
  • 语言: 其他
  • 标签:

资源简介

双管道(CreatePipe)与cmd.exe进程间通信的有关问题 完美解决代码 ,发布啦

资源截图

代码片段和文件信息

// controlDOS.cpp : Defines the entry point for the console application.
//

#include “stdafx.h“
#include 
#include 
#define SEND_BUFF_SIZE 1024

//实现去除执行结果中的 命令字符串+“\n“
void print(char *cmdstr)
{
while(*((char*)cmdstr++)!=‘\n‘);
printf(cmdstr);
}



int main()
{
HANDLE hReadPipe1hWritePipe1hReadPipe2hWritePipe2; //四个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&sa0))//创建两个匿名管道   导向DOS输入输出通道
    {
        return -1;
    }
    if(!CreatePipe(&hReadPipe2&hWritePipe2&sa0))
    {
        return -1;
    }

//启动信息
    STARTUPINFO si;
    ZeroMemory(&sisizeof(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(cmdLinesizeof(cmdLine));
    strcat(cmdLine (“\\cmd.exe“));

    PROCESS_INFORMATION ProcessInformation;
    if(CreateProcess(cmdLineNULLNULLNULLTRUE0NULLNULL&si&ProcessInformation) == 0)
    {
        return -1;
    }


    unsigned long lBytesReadlBytesWrite;//读写数量存放变量

while(TRUE){
lBytesRead=0;
ZeroMemory(Buffsizeof(Buff));
ret=PeekNamedPipe(hReadPipe1BuffSEND_BUFF_SIZE&lBytesRead00);//管道是否有数据可读
if(lBytesRead)    
{
            //第一次可以读到cmd的初始化信息
memset(Buff 0 sizeof(Buff));
            ret=ReadFile(hReadPipe1BuffSEND_BUFF_SIZE&lBytesRead0);//读取管道里的数据
            //如果读到数据,则对数据进行下一步处理。。。。。。。  
//printf(Buff);
print(Buff);
}
else{
//解决方案  估计windows是以“\r\n“结束的吧,所以要在命令执行后,显示完全后写入这个
/***********************************************************/
WriteFile(hWritePipe2 “\r\n“2&lBytesWrite0);
Sleep(100);
ret=ReadFile(hReadPipe1BuffSEND_BUFF_SIZE&lBytesWrite0);//读取管道里的数据
/***********************************************************/


//读入输入数据  以回车结束
char ch;
ZeroMemory(sendBuffsizeof(sendBuff));
int count=0;
while((ch=getchar())!=‘\n‘)
{
sendBuff[count]=ch;
count++;
}
//加入回车
strcat(sendBuff“\r\n“);
//写入数据,执行命令
if(!WriteFile(hWritePipe2 sendBuffsizeof(sendBuff)&lBytesWrite0))                     
{
printf(“WriteFile Error!!\r\n“);
return -1;
}
//延时,等待程序执行
Sleep(100);
}
}
    
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       2820  2013-11-17 15:53  controlDOS\controlDOS.cpp

     文件       4329  2013-11-16 18:42  controlDOS\controlDOS.dsp

     文件        528  2013-11-16 16:52  controlDOS\controlDOS.dsw

     文件      33792  2013-11-16 16:56  controlDOS\controlDOS.ncb

     文件      48640  2013-11-16 16:56  controlDOS\controlDOS.opt

     文件       1761  2013-11-17 15:55  controlDOS\controlDOS.plg

     文件     172092  2013-11-16 16:56  controlDOS\Debug\controlDOS.exe

     文件     176516  2013-11-16 16:56  controlDOS\Debug\controlDOS.ilk

     文件      44630  2013-11-16 16:55  controlDOS\Debug\controlDOS.obj

     文件     190880  2013-11-16 16:53  controlDOS\Debug\controlDOS.pch

     文件     345088  2013-11-16 16:55  controlDOS\Debug\controlDOS.pdb

     文件       1767  2013-11-16 16:53  controlDOS\Debug\StdAfx.obj

     文件     132096  2013-11-16 16:56  controlDOS\Debug\vc60.idb

     文件     233472  2013-11-16 16:55  controlDOS\Debug\vc60.pdb

     文件       1232  2013-11-16 16:52  controlDOS\ReadMe.txt

     文件      40960  2013-11-17 15:55  controlDOS\Release\controlDOS.exe

     文件        297  2013-11-16 16:52  controlDOS\StdAfx.cpp

     文件        667  2013-11-16 16:52  controlDOS\StdAfx.h

     目录          0  2013-11-16 16:55  controlDOS\Debug

     目录          0  2013-11-17 15:55  controlDOS\Release

     目录          0  2013-11-17 15:55  controlDOS

----------- ---------  ---------- -----  ----

              1431567                    21


评论

共有 条评论

相关资源