CreateProcess 执行CMD命令,并重定向输出
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命令,并重定向输出的更多相关文章
- java执行cmd命令并获取输出结果
1.java执行cmd命令并获取输出结果 import java.io.BufferedReader; import java.io.InputStreamReader; import org.apa ...
- C语言使用cmd命令并获取输出方法
转自http://blog.csdn.net/hxh129/article/details/8000205 C语言使用cmd命令并获取输出方法 在实践中,我们有时候需要用C语言来调用cmd的命令,并得 ...
- linux脚本: 后台启动程序并重定向输出信息脚本
后台启动程序并重定向输出信息脚本 新建文件mstart, 写入下面代码. #!/bin/bash $1 1>/etc/null 2>&1 & 说明 1>/etc/nu ...
- C# 执行CMD命令的方法
/// <summary> /// 执行CMD命令 /// </summary> /// <param name="str"></para ...
- 如何使用Java执行cmd命令
用JAVA代码实现执行CMD命令的方法! Runtime rt = Runtime.getRuntime(); Process p = rt.exec(String[] cmdarray); ...
- SQL server 存储过程 C#调用Windows CMD命令并返回输出结果 Mysql删除重复数据保留最小的id C# 取字符串中间文本 取字符串左边 取字符串右边 C# JSON格式数据高级用法
create proc insertLog@Title nvarchar(50),@Contents nvarchar(max),@UserId int,@CreateTime datetimeasi ...
- Atitit.执行cmd 命令行 php
Atitit.执行cmd 命令行 php 1. 执行cmd 命令行,调用系统命令的基础 1 1.1. 实际执行模式 1 1.2. 空格的问题 1 1.3. 中文路径的问题,程序文件读取编码设置 1 1 ...
- java中执行cmd命令
一.java执行cmd命令的三种方式:http://www.jb51.net/article/80829.htm 参考:https://www.cnblogs.com/zhufu9426/p/7928 ...
- JAVA之执行cmd命令
感言在前:时隔好久没有更新博客园了,忙东忙西也没忙出个什么之所以然来.回首过去一两个月,只能用“疲倦”两个字来形容,而且是身心疲惫.每天11.12个小时的工作我都没觉得烦,但是总是想克服却又很难克服的 ...
随机推荐
- 常见的C++数学计算库
来源: https://blog.csdn.net/panhao762/article/details/55276811 作为理工科学生,想必有限元分析.数值计算.三维建模.信号处理.性能分析.仿真分 ...
- 机器学习12—FP-growth学习笔记
test12.py #-*- coding:utf-8 import sys sys.path.append("fpGrowth.py") import fpGrowth from ...
- RecyclerView 踩坑
一.RecyclerView设置拖动后怎么监听拖动的开始和结束 ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.Cal ...
- Hp服务器 iLO3 使用方法
首先iLO3 和ipmi什么关系?如下是我摘自:hp官网 的一段话 With HP iLO3, you can: Experience a fast Remote Console incorpora ...
- 【Atheros】网卡驱动速率调整算法概述
我做网卡驱动,最主要的内容就是设计和改进速率调整算法,随着802.11协议簇的新标准越来越多,速率越来越高,调制编码方式也越来越多,一般来说,速率越高越可能丢包,速率越低越稳定,这是整体状况,但不是必 ...
- Linux Samba文件共享服务配置
http://blog.csdn.net/xht555/article/details/4631063
- uiwebview 屏幕自适应 -- 根据 内容适应或者 webview适应
#import <UIKit/UIKit.h> @interface ViewController : UIViewController<UIWebViewDelegate,UISe ...
- centOS6.2 最小安装下的无线网络配置
一.安装wireless_tools,http://www.linuxfromscratch.org/blfs/view/svn/basicnet/wireless_tools.html 二.vi / ...
- JS获取图片的缩略图
js获取上传文件的缩略图 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 鼠标画矩形openCV
#include <cv.h> #include <highgui.h> #include <stdio.h> /*鼠标画矩形*/ void my_mouse_ca ...