1、

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

 1 function TfrmMain.ExecDosCmd :boolean;
 2 var sa :SECURITY_ATTRIBUTES;
 3     si :STARTUPINFO;
 4     pi :PROCESS_INFORMATION;
 5
 6     pcDosCmd :PChar;
 7     hRead,hWrite :THandle;
 8     cCommand :array[0..1023] of char;  //长达1k的命令行,够用了吧
 9     pcCommand1 :PChar;
10     cBuffer :array[0..4095] of char; //用4k的空间来存储输出的内容,只要不是显示文件内容,一般情况下是够用了。
11     bytesRead :DWORD;
12     dwExitCode :DWORD;
13
14     buf01 :array[0..4095] of char;
15     iLen01 :integer;
16 begin
17   Result := false;
18   //pcDosCmd := 'dir c:\';      //可以换成你的命令
19   pcDosCmd := 'ping 192.168.2.1';      //可以换成你的命令
20
21   sa.nLength := sizeof(SECURITY_ATTRIBUTES);
22   sa.lpSecurityDescriptor := nil;
23   sa.bInheritHandle := true;
24   if (not CreatePipe(hRead, hWrite, @sa, 0)) then
25     Exit;
26
27   pcCommand1 := 'Cmd.exe /C ';
28   ZeroMemory(@cCommand[0], length(cCommand));
29   CopyMemory(@cCommand[0], pcCommand1, strlen(pcCommand1));
30   CopyMemory(@cCommand[strlen(pcCommand1)], pcDosCmd, strlen(pcDosCmd));
31   cCommand[strlen(pcCommand1) + strlen(pcDosCmd)] := chr(0);
32
33   si.cb := sizeof(STARTUPINFO);
34   GetStartupInfo(si);
35   si.hStdError := hWrite;            //把创建进程的标准错误输出重定向到管道输入
36   si.hStdOutput := hWrite;           //把创建进程的标准输出重定向到管道输入
37   si.wShowWindow := SW_HIDE;
38   si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
39   //关键步骤,CreateProcess函数参数意义请查阅MSDN
40   if (not CreateProcess(nil, cCommand, nil, nil, true, 0, nil, nil, si, pi)) then
41   begin
42     CloseHandle(hWrite);
43     CloseHandle(hRead);
44     Exit;
45   end;
46   CloseHandle(hWrite);
47
48   iLen01 := 0;
49   while (true) do
50   begin
51     //ZeroMemory(@cBuffer[0], length(cBuffer));
52     if (not ReadFile(hRead, cBuffer[0], 4095, bytesRead, nil)) then
53       break;
54     //cBuffer[bytesRead] := chr(0);
55     //cBuffer中就是执行的结果,可以保存到文本,也可以直接输出
56     //Memo1.Lines.Add(cBuffer);   //这里是弹出对话框显示
57     CopyMemory(@buf01[iLen01], @cBuffer[0], bytesRead);
58     iLen01 := iLen01 + bytesRead;
59   end;
60   buf01[iLen01] := chr(0);
61   Memo1.Lines.Add(buf01);
62
63   CloseHandle(hRead);
64   Result := true;
65
66   dwExitCode := 0;
67   WaitForSingleObject(pi.hProcess, INFINITE);
68   Windows.GetExitCodeProcess(pi.hProcess, dwExitCode);
69   Memo1.Lines.Add('子进程 退出码 : '+inttostr(dwExitCode));
70 end;

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

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

A

转载于:https://www.cnblogs.com/CodeSkill/p/4946045.html

CreateProcess 执行CMD命令,并重定向输出相关推荐

  1. C++ 执行cmd命令 并获取输出

    这是参考别人的 ,具体来源忘了,唉,等想起来一定补上出处 头文件 PipeCmd.h #ifndef _PIPE_CMD_H_ #define _PIPE_CMD_H_#include <Win ...

  2. C++使用CreateProcess执行cmd命令(实例演示)

    使用CreateProcess可以执行cmd命令,也可以执行一些可执行程序. //摘自msdn的示例代码 #include <windows.h> #include <stdio.h ...

  3. 【开发环境】Java 文件生成 Windows 系统 .bat 批处理文件并自动执行 ( 输出 GB2312 格式处理中文乱码 | \r\n换行 | Runtime 执行 Cmd 命令 )

    文章目录 Java 文件生成 Windows 系统 .bat 批处理文件并自动执行 1.生成 bat 脚本注意事项 2.Java 执行 Cmd 命令 3.完整代码示例 4.执行结果 Java 文件生成 ...

  4. java -version cmd_java如何运行步骤cmd?Java执行cmd命令方法有哪些?

    写好一个java程序之后,我们的最终目的就是可以正确的运行程序,如果程序运行正确了,那么代码也就没有什么问题了,可是java如何运行步骤cmd?接下来,我们就来给大家讲解一下这方面的内容. 1.首先用 ...

  5. python 命令-python执行cmd命令

    我们在做手机端自动化的时候有时候可能会遇到需要执行cmd命令完成用例,我们一起学习下,通过python脚本执行cmd命令 cmd是什么 cmd是command的缩写.即命令提示行(CMD),是在OS ...

  6. 命令行无法运行php,php不支持执行cmd命令行

    php不支持执行cmd命令行是因为你没有关闭php配置文件中的安全模式. 在php.ini文件中配置safe_mode参数支持命令执行的方法: 首先,打开php.ini,关掉安全模式safe_mode ...

  7. Winform中实现执行cmd命令的工具类

    场景 Winform中执行cmd命令的工具类,比如调用某些exe,类似mysqldump.exe这样类似的命令. 新建工具类CmdHelper using System; using System.C ...

  8. python执行cmd并返回是否成功_python脚本执行CMD命令并返回结果的例子

    最近写脚本的时想要用python直接在脚本中去执行cmd命令,并且将返回值打印出来供下面调用,所以特意查了下,发现主要有一下几种方式来实现,很简单: 就拿执行adb, adb shell, adb d ...

  9. python 调用控制台并获取返回结果_python脚本执行CMD命令并返回结果的例子

    最近写脚本的时想要用python直接在脚本中去执行cmd命令,并且将返回值打印出来供下面调用,所以特意查了下,发现主要有一下几种方式来实现,很简单: 就拿执行adb, adb shell, adb d ...

最新文章

  1. Android通过Chrome Inspect调试WebView
  2. 朗讯项目的一个概括总结.
  3. Android简易音乐播放器实现代码
  4. 我最喜欢的IntelliJ IDEA功能
  5. “BindingNavigator”如何在删除前弹出确认框?
  6. Recommendation
  7. CPU输入/输出的控制方式有哪些?
  8. 倾斜摄影发展历程简介
  9. Android 10 SystemUI中Android.bp文件中集成第三方JAR包或者so文件的方法
  10. 世界著名半导体公司及其官网
  11. 最详细的Log4j使用教程
  12. 汽车制造行业汽车电子,从哪里开始,你合适吗?
  13. 计算格拉姆矩阵_如何用简单易懂的例子解释格拉姆矩阵/Gram matrix?
  14. 大家来讨论怎么写概要设计
  15. 新必应 new bing【NB】这不比知云翻译香
  16. week05-继承、多态、抽象类与接口
  17. Linux shell编程100例
  18. python保存requests请求的文件的实战代码
  19. 语音标注必须了解的基础知识点
  20. Memcached单键超1M数据量的拆分设计及测试

热门文章

  1. python埋点测试_测试一面(宇宙条)
  2. Docker容器镜像删除不掉解决办法?
  3. dofilter在java中_在Filter的doFilter中进行重定向 出现异常
  4. Javascript模块化编程系列一: 模块化的驱动
  5. DedeCMS 批量删除垃圾注册用户和垃圾文档
  6. java spark es_ES-Spark连接ES后,ES Client节点流量打满分析
  7. linux命令及其使用方法,Linux命令及其使用方法
  8. Farey Sequence(欧拉函数板子题)
  9. Windows操作系统下使用pip安装pygame
  10. 将tomcat设置成window自启动服务