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个小时的工作我都没觉得烦,但是总是想克服却又很难克服的 ...
随机推荐
- swift - 全屏pop手势
UINavigationController系统自带有侧滑手势,但是这个手势第一点只能边缘侧滑才可以有效,第二点当手动隐藏系统的导航时,这个手势就不能生效了 为了能到达到全屏pop的效果这里有2中解决 ...
- bzoj3531【SDOI2014】旅行
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 850 Solved: 433 [Submit][Status ...
- 出现windows启动服务失败(无法从命令行或调试器启动,需要安装InstallUtil.exe)的解决办法
两种方法1 从命令行安装2 选择项目-视图-自定义操作 然后将 安装,提交,回滚,卸载分别加入自定义操作,注意InstallClass属性为true
- 通俗的解释下音视频同步里pcr作用
PCR同步在非硬件精确时钟源的情况还是谨慎使用,gstreamer里面采用PCR同步,但是发现好多ffmpeg转的片儿,或者是CP方的片源,pcr打得很粗糙的,老是有跳帧等现象.音视频同步,有三种方法 ...
- SVN版本号控制软件-图片含义具体解释
转载请注明出处:http://blog.csdn.net/zhuwentao2150/article/details/51195154 自己定义SVN图标显示风格 SVN的图标是能够自己定义风格的 右 ...
- Mysql主从复制,实现数据同步
大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...
- iOS将Unity导出的Xcode工程导入到另一个Xcode项目, 及常见报错的解决方法
demo下载地址 http://pan.baidu.com/s/1pLcpKpl 1.Unity导出工程时设置bundle id要与项目一致 2.修改bit code为NO 3.删除Main.stor ...
- 微信小程序事件
微信小程序事件1.什么是事件2.事件类别3.事件冒泡4.事件绑定5.事件对象详解笔记:1.事件是一种用户的行为,是一种通讯方式.2.事件类别: 点击事件:tap 长按事件:longtap ...
- Maven插件wro4j-maven-plugin压缩、合并js、css详解
1. 在pom.xml文件中,引入wro4j-maven-plugin插件 <plugin> <groupId>ro.isdc.wro4j</groupId> ...
- AFN多文件进度下载
AFN参考资料 http://www.jianshu.com/p/c36159094e24 http://blog.cnbang.net/tech/2320/http://blog.cnbang.ne ...