通过管道方式(CreatePipe)获取DOS命令行执行后的返回结果

希望可以将DOS命令行执行的命令结果返回后,进行一定处理,在Windows下可以用管道实现,将其简单包装了下。
具体对应函数是
CreatePipe
http://baike.baidu.com/view/1285858.htm
CreateProcess
http://baike.baidu.com/view/697167.htm
 
#include <windows.h>

//初始化字符串指针
char* StringInit()
{
    char *str= (char*)malloc(1*sizeof(char));
    memset(str,0,1*sizeof(char));
    return str;
}

//设置字符串为指定字符
char* StringSet(char* str,const char* toset)
{
    int len=strlen(toset)+1;
    str= (char*)realloc(str,len*sizeof(char));
    strcpy (str,toset);
    return str;
}

//在字符串末尾添加指定字符串
char* StringAppent(char* first,const char* last)
{
    int len=strlen(first)+strlen(last)+1;
    first = (char*)realloc(first,len*sizeof(char));
    strcat(first,last);
    return first;
}

//在字符串指定位置添加指定字符串
char* StringInsert(char* str,const char* insert,int start)
{
    //对开始插入的数字进行验证
    if(start>strlen(str)){
        start=strlen(str);
    }else if (start<0){
        start=0;
    }
    //重新分配内容
    int pos=strlen(str);
    int len=strlen(str)+strlen(insert)+1;
    str= (char*)realloc(str,len*sizeof(char));

    //使用指针的方式进行遍历
    int i;
    //通过倒序方式将准备插入数据后位置的数据复制到最后
    for(i=1;i<=pos-start;i++){
        str[len-i-1]=str[len-i-strlen(insert) -1];
    }
    //将准备插入的数据插入到开始插入的地方
    for(i=1;i<=strlen(insert);i++){
        str[i+start-1]=insert[i-1];
    }
    //末尾置0
    str[len-1]='\0';
    return str;
}
//通过管道方式获取执行的DOS命令的返回值
char* RunCmd(const char* cmd)
{
    SECURITY_ATTRIBUTES sa;
    HANDLE hRead,hWrite;

    sa.nLength=sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor=NULL;
    sa.bInheritHandle=TRUE;
    if (!CreatePipe(&hRead,&hWrite,&sa,0)) {
        printf("error");
        return;
    }
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    si.cb=sizeof(STARTUPINFO);
    GetStartupInfo(&si);
    si.hStdError=hWrite;
    si.hStdOutput=hWrite;
    si.wShowWindow=SW_HIDE;
    si.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    
    /* Quick-and-dirty的实现
    char * runcmd;
    int len = strlen("c://windows//system32//cmd.exe /c ") + strlen(cmd) + 1;
    runcmd = (char*)malloc(len*sizeof(char));
    memset(runcmd,0,len*sizeof(char));
    sprintf(runcmd,"c://windows//system32//cmd.exe /c %s",cmd); 
    */
    char* runcmd=StringInit();
    runcmd=StringSet(runcmd,cmd);
    runcmd=StringInsert(runcmd,"c://windows//system32//cmd.exe /c ",0);

    //printf("%s\n",runcmd);
    if (!CreateProcess(NULL,runcmd,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi)) {
        printf("error");
        return;
    }
    CloseHandle(hWrite);

    char buffer[128]={0};
    char* result=StringInit();

    DWORD bytesRead;
    
    while (1) {
        if (ReadFile(hRead,buffer,127,&bytesRead,NULL) ==FALSE)
            break;
        result=StringAppent(result,buffer);
        memset(buffer,0,127);
        //sleep(1);
    }
    return result;
    
}
int main(){

    char* ttt=StringInit();
    
    ttt=StringSet(ttt,"abc");
    ttt=StringInsert(ttt,"123",0);
    printf("%s\n",ttt);

    ttt=StringSet(ttt,"abcde");
    ttt=StringInsert(ttt,"54321",66);
    printf("%s\n",ttt);

    char* p =StringInit();
    char* cmd=StringInit();

    cmd=StringSet(cmd,"ipconfig");
    p =RunCmd(cmd);
    printf("%s",p);

    cmd=StringSet(cmd,"ping 202.102.192.68");
    p =RunCmd(cmd);
    printf("%s",p);

    cmd=StringSet(cmd,"dir \"e:\\Documents and Settings\\");
    p =RunCmd(cmd);
    printf("%s",p);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值