1、

参考网址:http://www.cnblogs.com/cnarg/archive/2011/02/20/1959292.html

 function TfrmMain.ExecDosCmd :boolean;
var sa :SECURITY_ATTRIBUTES;
si :STARTUPINFO;
pi :PROCESS_INFORMATION; pcDosCmd :PChar;
hRead,hWrite :THandle;
cCommand :array[..] of char; //长达1k的命令行,够用了吧
pcCommand1 :PChar;
cBuffer :array[..] of char; //用4k的空间来存储输出的内容,只要不是显示文件内容,一般情况下是够用了。
bytesRead :DWORD;
dwExitCode :DWORD; buf01 :array[..] of char;
iLen01 :integer;
begin
Result := false;
//pcDosCmd := 'dir c:\'; //可以换成你的命令
pcDosCmd := 'ping 192.168.2.1'; //可以换成你的命令 sa.nLength := sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor := nil;
sa.bInheritHandle := true;
if (not CreatePipe(hRead, hWrite, @sa, )) then
Exit; pcCommand1 := 'Cmd.exe /C ';
ZeroMemory(@cCommand[], length(cCommand));
CopyMemory(@cCommand[], pcCommand1, strlen(pcCommand1));
CopyMemory(@cCommand[strlen(pcCommand1)], pcDosCmd, strlen(pcDosCmd));
cCommand[strlen(pcCommand1) + strlen(pcDosCmd)] := chr(); si.cb := sizeof(STARTUPINFO);
GetStartupInfo(si);
si.hStdError := hWrite; //把创建进程的标准错误输出重定向到管道输入
si.hStdOutput := hWrite; //把创建进程的标准输出重定向到管道输入
si.wShowWindow := SW_HIDE;
si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
//关键步骤,CreateProcess函数参数意义请查阅MSDN
if (not CreateProcess(nil, cCommand, nil, nil, true, , nil, nil, si, pi)) then
begin
CloseHandle(hWrite);
CloseHandle(hRead);
Exit;
end;
CloseHandle(hWrite); iLen01 := ;
while (true) do
begin
//ZeroMemory(@cBuffer[0], length(cBuffer));
if (not ReadFile(hRead, cBuffer[], , bytesRead, nil)) then
break;
//cBuffer[bytesRead] := chr(0);
//cBuffer中就是执行的结果,可以保存到文本,也可以直接输出
//Memo1.Lines.Add(cBuffer); //这里是弹出对话框显示
CopyMemory(@buf01[iLen01], @cBuffer[], bytesRead);
iLen01 := iLen01 + bytesRead;
end;
buf01[iLen01] := chr();
Memo1.Lines.Add(buf01); CloseHandle(hRead);
Result := true; dwExitCode := ;
WaitForSingleObject(pi.hProcess, INFINITE);
Windows.GetExitCodeProcess(pi.hProcess, dwExitCode);
Memo1.Lines.Add('子进程 退出码 : '+inttostr(dwExitCode));
end;

PS:CreateProcess()输出到文件 里面用到的 “HANDLE hTemp = GetStdHandle(STD_OUTPUT_HANDLE);”“SetStdHandle(STD_OUTPUT_HANDLE, hFile);// 设置标准输出” ,应该是将本进程默认的标准输入输出都改变了,而非是“将子进程的标准输出重定向到刚刚创建的文件句柄”。

ZC:由于 只执行“SetStdHandle(STD_OUTPUT_HANDLE, hFile);” 的话,本进程的标准输出流是不会改变的,又∵作者在SetStdHandle之后才执行GetStartupInfo,因此子进程的 标准输出被重定位了,而父进程的标准输出没有变化。

A

CreateProcess 执行CMD命令,并重定向输出的更多相关文章

  1. java执行cmd命令并获取输出结果

    1.java执行cmd命令并获取输出结果 import java.io.BufferedReader; import java.io.InputStreamReader; import org.apa ...

  2. C语言使用cmd命令并获取输出方法

    转自http://blog.csdn.net/hxh129/article/details/8000205 C语言使用cmd命令并获取输出方法 在实践中,我们有时候需要用C语言来调用cmd的命令,并得 ...

  3. linux脚本: 后台启动程序并重定向输出信息脚本

    后台启动程序并重定向输出信息脚本 新建文件mstart, 写入下面代码. #!/bin/bash $1 1>/etc/null 2>&1 & 说明 1>/etc/nu ...

  4. C# 执行CMD命令的方法

    /// <summary> /// 执行CMD命令 /// </summary> /// <param name="str"></para ...

  5. 如何使用Java执行cmd命令

    用JAVA代码实现执行CMD命令的方法! Runtime rt = Runtime.getRuntime(); Process p = rt.exec(String[] cmdarray);     ...

  6. SQL server 存储过程 C#调用Windows CMD命令并返回输出结果 Mysql删除重复数据保留最小的id C# 取字符串中间文本 取字符串左边 取字符串右边 C# JSON格式数据高级用法

    create proc insertLog@Title nvarchar(50),@Contents nvarchar(max),@UserId int,@CreateTime datetimeasi ...

  7. Atitit.执行cmd 命令行 php

    Atitit.执行cmd 命令行 php 1. 执行cmd 命令行,调用系统命令的基础 1 1.1. 实际执行模式 1 1.2. 空格的问题 1 1.3. 中文路径的问题,程序文件读取编码设置 1 1 ...

  8. java中执行cmd命令

    一.java执行cmd命令的三种方式:http://www.jb51.net/article/80829.htm 参考:https://www.cnblogs.com/zhufu9426/p/7928 ...

  9. JAVA之执行cmd命令

    感言在前:时隔好久没有更新博客园了,忙东忙西也没忙出个什么之所以然来.回首过去一两个月,只能用“疲倦”两个字来形容,而且是身心疲惫.每天11.12个小时的工作我都没觉得烦,但是总是想克服却又很难克服的 ...

随机推荐

  1. iOS 解决TableView reloadData时cell中图片会闪的问题

    tableView调用reloaddata的时候发现有个小问题,每次刷新图片都会抖动闪烁一下,看着很难受,也影响体验.造成这个问题的主要原因是因为刷新时候切换图片导致.要解决这个问题也很好解决,使用S ...

  2. 题目1 : Farthest Point

    时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 Given a circle on a two-dimentional plane. Output the integral ...

  3. protobuf编译安装

    为什么选择protobuf,而不选择thift和avro,原因大概几点吧,网上对比的文章很多,我主要关注以下几点 1.protobuf序列化性能最好,序列化后字节数最少. 2.protobuf是单纯的 ...

  4. Java并发基础:了解无锁CAS就从源码分析

    https://segmentfault.com/a/1190000015881923

  5. ViewPager系列之 仿魅族应用的广告BannerView(转)

    转载:http://www.open-open.com/lib/view/open1496585426285.html 使用方法:http://www.see-source.com/androidwi ...

  6. ipmitool常用命令

    然后查看ip等信息,使用如下命令: ipmitool lan print 远程访问 可使用如下命令尝试: ipmitool -I lanplus -H 10.108.125.227 -U Admini ...

  7. 让WebRTC支持H264编解码

    近期实验了下怎样让WebRTC支持H264编码.记录下,供有须要的人參考. 说明一下,我是在 Ubuntu Server 14.04 下编译的 WebRTC ,使用 native(C++) api 开 ...

  8. Throwing Dice(概率dp)

    C - Throwing Dice Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Lig ...

  9. WebApi 中使用 Session

    1. 在 Global.asax.cs 文件中加入session支持 protected void Application_Start() { AreaRegistration.RegisterAll ...

  10. C++模板类[初步]

    /* * stacktp.h * * Created on: 2014年3月29日 * Author: */ /** * - 模板类的概念,与使用 * -# export template <c ...