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. Unity3D 之IAP

    本人是一个Unity忠实爱好者,鉴于网上关于Unity的内置付费教程 少之甚少,本人就把自己倒腾过的IAp分享出来,仅供大家参考.一.搭建号沙盒环境( 详细请看:http://xiaominghimi ...

  2. 解决myeclipse10.x的Servers产生的at com.genuitec.eclipse.ast.deploy.core.Deployment.<init>(Unknown Source)错

    错误: java.lang.NullPointerException at com.genuitec.eclipse.ast.deploy.core.Deployment.<init>(U ...

  3. openWRT自学---对官方的开发指导文档的解读和理解 记录2:如何控制内核模块的编译

    openwrt对于kernel module的处理分两类:随内核主线而来的kernel module 和 其他作为独立project的kernel module.而这两种,openwrt将采用相同的模 ...

  4. Oracle PL/SQL 高级编程

    1. 复合数据类型--记录类型 Ø        语法格式 type  类型名 is   record ( 字段1  字段1类型 [not null]:=表达式1; 字段2  字段2类型 [not n ...

  5. Power of Cryptography - poj 2109

      Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 20351   Accepted: 10284 Description C ...

  6. 程序包 javax.servlet 不存在 解决办法

    其原因是java编译器没有找到软件包javax.servlet. 下载servlet.jar放到lib下没有效果,后发现需要在jdk中添加,如下: 解决办法: 从tomcat lib目录下拷贝一个se ...

  7. Lua string文件类型判断和内容解析

    [1]文件名称类型判断和解析 local fileName = "shanxi201904npsdr1_200000.zip" print("len : " . ...

  8. CSU 1663: Tree(树链剖分)

    1663: Tree Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 26  Solved: 11 [Submit][id=1663"> ...

  9. Disruptor 创建过程

    1 Disruptor disruptor = new Disruptor<ValueEvent>(ValueEvent.EVENT_FACTORY, ringBufferSize, ex ...

  10. 实战c++中的vector系列--creating vector of local structure、vector of structs initialization

    之前一直没有使用过vector<struct>,如今就写一个简短的代码: #include <vector> #include <iostream> int mai ...