控制台输出重定向到Memo

//函数RunCmd
void __fastcall TForm1::RunCmd(AnsiString CmdLine,TStrings *Result)
{
    HANDLE hReadPipe,hWritePipe,hParentStdout;
    SECURITY_ATTRIBUTES  sa;
    OSVERSIONINFO osVer;
    osVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx(&osVer);
    if (osVer.dwPlatformId == VER_PLATFORM_WIN32_NT) {
        sa.nLength = sizeof(sa);
        sa.bInheritHandle = true;
        sa.lpSecurityDescriptor = NULL;
        CreatePipe(&hReadPipe,&hWritePipe,&sa, 0);
    }
    else
        CreatePipe(&hReadPipe,&hWritePipe,NULL,1024);
    Screen->Cursor = crHourGlass;
    try {
        DuplicateHandle(GetCurrentProcess(),hReadPipe,
                GetCurrentProcess(),&hParentStdout,
                0,false,DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE);
        SetStdHandle(STD_OUTPUT_HANDLE,hWritePipe);
        STARTUPINFO si;
        GetStartupInfo(&si);
        si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
        si.wShowWindow = SW_HIDE;
        si.cb = sizeof(STARTUPINFO);
        si.hStdOutput = hWritePipe;
        si.hStdError = hWritePipe;
        PROCESS_INFORMATION pi;
        if (CreateProcess(NULL,CmdLine.c_str(),NULL,NULL,true,0,NULL,NULL,&si,&pi)) {
            WaitForSingleObject(pi.hProcess,INFINITE);
            char sBuf[1024] = {0};
            DWORD dwTotal, dwRead;
            if (PeekNamedPipe(hReadPipe, sBuf, sizeof(sBuf)-1, &dwTotal, NULL, NULL)
                && dwTotal > 0)
            {
                do {
                    ReadFile(hParentStdout, sBuf, dwTotal, &dwRead, NULL);
                    //由于命令返回可能大于1024字节,Add方法可能造成断行,可把缓冲区设大点
                    Result->Add(AnsiString(sBuf));
                } while(dwRead >= dwTotal);
            }
            CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);
        }
    }
    __finally {
        CloseHandle(hReadPipe);
        CloseHandle(hWritePipe);
        Screen->Cursor = crDefault;
    }
}

把DOS命令返回的结果显示到Memo中,使用如下函数:
//调用方法:
RunCmd("netstat -a -n",Memo1->Lines);


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值