1. //K8执行DOS并返回结果
  2. function RunDosCommand(Command: string): string;
  3. var
  4. hReadPipe: THandle;
  5. hWritePipe: THandle;
  6. SI: TStartUpInfo;
  7. PI: TProcessInformation;
  8. SA: TSecurityAttributes;
  9. //     SD   :   TSecurityDescriptor;
  10. BytesRead: DWORD;
  11. Dest: array[0..1023] of char;
  12. CmdLine: array[0..512] of char;
  13. TmpList: TStringList;
  14. Avail, ExitCode, wrResult: DWORD;
  15. osVer: TOSVERSIONINFO;
  16. tmpstr: string;
  17. begin
  18. osVer.dwOSVersionInfoSize := Sizeof(TOSVERSIONINFO);
  19. GetVersionEX(osVer);
  20. if osVer.dwPlatformId = VER_PLATFORM_WIN32_NT then
  21. begin
  22. //         InitializeSecurityDescriptor(@SD,   SECURITY_DESCRIPTOR_REVISION);
  23. //         SetSecurityDescriptorDacl(@SD,   True,   nil,   False);
  24. SA.nLength := SizeOf(SA);
  25. SA.lpSecurityDescriptor := nil; //@SD;
  26. SA.bInheritHandle := True;
  27. CreatePipe(hReadPipe, hWritePipe, @SA, 0);
  28. end
  29. else
  30. CreatePipe(hReadPipe, hWritePipe, nil, 1024);
  31. try
  32. FillChar(SI, SizeOf(SI), 0);
  33. SI.cb := SizeOf(TStartUpInfo);
  34. SI.wShowWindow := SW_HIDE;
  35. SI.dwFlags := STARTF_USESHOWWINDOW;
  36. SI.dwFlags := SI.dwFlags or STARTF_USESTDHANDLES;
  37. SI.hStdOutput := hWritePipe;
  38. SI.hStdError := hWritePipe;
  39. StrPCopy(CmdLine, Command);
  40. if CreateProcess(nil, CmdLine, nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil, SI, PI) then
  41. begin
  42. ExitCode := 0;
  43. while ExitCode = 0 do
  44. begin
  45. wrResult := WaitForSingleObject(PI.hProcess, 500);
  46. //                 if   PeekNamedPipe(hReadPipe,   nil,   0,   nil,   @Avail,   nil)   then
  47. if PeekNamedPipe(hReadPipe, @Dest[0], 1024, @Avail, nil, nil) then
  48. begin
  49. if Avail > 0 then
  50. begin
  51. TmpList := TStringList.Create;
  52. try
  53. FillChar(Dest, SizeOf(Dest), 0);
  54. ReadFile(hReadPipe, Dest[0], Avail, BytesRead, nil);
  55. TmpStr := Copy(Dest, 0, BytesRead - 1);
  56. TmpList.Text := TmpStr;
  57. Result := tmpstr;
  58. finally
  59. TmpList.Free;
  60. end;
  61. end;
  62. end;
  63. if wrResult <> WAIT_TIMEOUT then ExitCode := 1;
  64. end;
  65. GetExitCodeProcess(PI.hProcess, ExitCode);
  66. CloseHandle(PI.hProcess);
  67. CloseHandle(PI.hThread);
  68. end;
  69. finally
  70. CloseHandle(hReadPipe);
  71. CloseHandle(hWritePipe);
  72. end;
  73. end;
  74. //002
  75. function RunCommand(const cmd: string): string;
  76. var
  77. hReadPipe,hWritePipe:THandle;
  78. si:STARTUPINFO;
  79. lsa:SECURITY_ATTRIBUTES;
  80. pi:PROCESS_INFORMATION;
  81. cchReadBuffer:DWORD;
  82. pOutStr, pCMD:PChar;
  83. res, strCMD:string;
  84. begin
  85. strcmd := 'cmd.exe /k ' + cmd;
  86. pOutStr := AllocMem(5000);
  87. lsa.nLength := SizeOf(SECURITY_ATTRIBUTES);
  88. lsa.lpSecurityDescriptor := nil;
  89. lsa.bInheritHandle := True;
  90. if not CreatePipe(hReadPipe, hWritePipe, @lsa, 0) then Exit;
  91. FillChar(si, SizeOf(STARTUPINFO), 0);
  92. si.cb:=sizeof(STARTUPINFO);
  93. si.dwFlags:=(STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW);
  94. si.wShowWindow:=SW_HIDE;
  95. si.hStdOutput:=hWritePipe;
  96. if not CreateProcess(nil, PChar(strCMD), nil, nil, true, 0, nil, nil, si, pi) then Exit;
  97. while(true) do
  98. begin
  99. if not PeekNamedPipe(hReadPipe, pOutStr, 1, @cchReadBuffer, nil, nil) then break;
  100. if cchReadBuffer <> 0 then
  101. begin
  102. if not ReadFile(hReadPipe, pOutStr^, 4096, cchReadBuffer, nil) then break;
  103. pOutStr[cchReadbuffer]:=chr(0);
  104. //if @Show <> nil then Show(pOutStr);
  105. res := res + pOutStr;
  106. end else if(WaitForSingleObject(pi.hProcess ,0) = WAIT_OBJECT_0) then break;
  107. Sleep(10);
  108. Application.ProcessMessages;
  109. end;
  110. pOutStr[cchReadBuffer]:=chr(0);
  111. CloseHandle(hReadPipe);
  112. CloseHandle(pi.hThread);
  113. CloseHandle(pi.hProcess);
  114. CloseHandle(hWritePipe);
  115. FreeMem(pOutStr);
  116. Result := res;
  117. end;
  118. //003
  119. procedure CmdExecAndView(FileName: string; memo: TMemo);
  120. procedure _AddInfo(mmInfo:TMemo; S: string; var line: string);
  121. var
  122. i, p: Integer;
  123. begin
  124. if mmInfo.Lines.Count > 800 then
  125. mmInfo.Lines.Clear;
  126. //去掉 \r
  127. for i := 0 to Length(S) - 1 do
  128. if S[i] = #13 then S[i] := ' ';
  129. line := line + S;
  130. // \n 断行
  131. p := Pos(#10, line);
  132. if p > 0 then
  133. begin
  134. // \n 前面的加入一行,后面的留到下次
  135. mmInfo.Lines.Add(Copy(line, 1, p - 1));
  136. line := Copy(line, p + 1, Length(line) - p);
  137. end;
  138. end;
  139. var
  140. hReadPipe, hWritePipe: THandle;
  141. si: STARTUPINFO;
  142. lsa: SECURITY_ATTRIBUTES;
  143. pi: PROCESS_INFORMATION;
  144. cchReadBuffer: DWORD;
  145. ph: PChar;
  146. fname: PChar;
  147. line: string;
  148. begin
  149. fname := allocmem(1024);
  150. ph := AllocMem(1024);
  151. lsa.nLength := sizeof(SECURITY_ATTRIBUTES);
  152. lsa.lpSecurityDescriptor := nil;
  153. lsa.bInheritHandle := True;
  154. if CreatePipe(hReadPipe, hWritePipe, @lsa, 0) = false then
  155. Exit;
  156. fillchar(si, sizeof(STARTUPINFO), 0);
  157. si.cb := sizeof(STARTUPINFO);
  158. si.dwFlags := (STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW);
  159. si.wShowWindow := SW_HIDE;
  160. si.hStdOutput := hWritePipe;
  161. si.hStdError := hWritePipe;
  162. StrPCopy(fname, FileName);
  163. if CreateProcess(nil, fname, nil, nil, true, 0, nil, nil, si, pi) = False then
  164. begin
  165. FreeMem(ph);
  166. FreeMem(fname);
  167. Exit;
  168. end;
  169. CloseHandle(hWritePipe);
  170. while (true) do
  171. begin
  172. if not PeekNamedPipe(hReadPipe, ph, 1, @cchReadBuffer, nil, nil) then break;
  173. if cchReadBuffer <> 0 then
  174. begin
  175. if ReadFile(hReadPipe, ph^, 512, cchReadBuffer, nil) = false then break;
  176. ph[cchReadbuffer] := chr(0);
  177. _AddInfo(memo, ph, line);
  178. end
  179. else if (WaitForSingleObject(pi.hProcess, 0) = WAIT_OBJECT_0) then break;
  180. Application.ProcessMessages;
  181. Sleep(200);
  182. end;
  183. ph[cchReadBuffer] := chr(0);
  184. _AddInfo(memo, ph, line);
  185. CloseHandle(hReadPipe);
  186. CloseHandle(pi.hThread);
  187. CloseHandle(pi.hProcess);
  188. FreeMem(ph);
  189. FreeMem(fname);
  190. end;
  191. //004
  192. var
  193. hReadPipe,hWritePipe:THandle;
  194. si:STARTUPINFO;
  195. lsa:SECURITY_ATTRIBUTES;
  196. pi:PROCESS_INFORMATION;
  197. mDosScreen:String;
  198. cchReadBuffer:DWORD;
  199. ph:PChar;
  200. fname:PChar;
  201. i,j:integer;
  202. begin
  203. fname:=allocmem(255);
  204. ph:=AllocMem(5000);
  205. lsa.nLength :=sizeof(SECURITY_ATTRIBUTES);
  206. lsa.lpSecurityDescriptor :=nil;
  207. lsa.bInheritHandle :=True;
  208. if CreatePipe(hReadPipe,hWritePipe,@lsa,0)=false then
  209. begin
  210. ShowMessage('Can not create pipe!');
  211. exit;
  212. end;
  213. fillchar(si,sizeof(STARTUPINFO),0);
  214. si.cb :=sizeof(STARTUPINFO);
  215. si.dwFlags :=(STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW);
  216. si.wShowWindow :=SW_HIDE;
  217. si.hStdOutput :=hWritePipe;
  218. StrPCopy(fname,EditFilename.text);
  219. if CreateProcess( nil, fname, nil, nil, true, 0, nil, nil, si, pi) = False  then
  220. begin
  221. ShowMessage('can not create process');
  222. FreeMem(ph);
  223. FreeMem(fname);
  224. Exit;
  225. end;
  226. while(true) do
  227. begin
  228. if not PeekNamedPipe(hReadPipe,ph,1,@cchReadBuffer,nil,nil) then break;
  229. if cchReadBuffer<>0 then
  230. begin
  231. if ReadFile(hReadPipe,ph^,4096,cchReadBuffer,nil)=false then break;
  232. ph[cchReadbuffer]:=chr(0);
  233. Memo1.Lines.Add(ph);
  234. end
  235. else if(WaitForSingleObject(pi.hProcess ,0)=WAIT_OBJECT_0) then break;
  236. Sleep(100);
  237. end;
  238. ph[cchReadBuffer]:=chr(0);
  239. Memo1.Lines.Add(WideCharToString(ph));
  240. CloseHandle(hReadPipe);
  241. CloseHandle(pi.hThread);
  242. CloseHandle(pi.hProcess);
  243. CloseHandle(hWritePipe);
  244. FreeMem(ph);
  245. FreeMem(fname);
  246. end;

http://blog.csdn.net/earbao/article/details/21160033

delphi cmd(4个例子都是通过管道取得)的更多相关文章

  1. Delphi完成的断点续传例子 转

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  2. delphi 三层架构简单例子(经测试成功)

    delphi 三层架构简单例子(经测试成功) 转载 2013年12月19日 09:48:57 1100 所谓三层: (1) 客户端 (2) 服务器端 (3) 数据库 在数据访问时,使得客户端必须通过服 ...

  3. 和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧。因为,很多PCI的例子都是对S5933,就连微软出版的《Programming the Microsoft Windows Driver Model》都提供了一个完整的S5933的例子。 在这篇有关DDK的开发论文里。

    和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧.因为,很多PCI的例子都是对S5933,就连微软出版的<Programming the Microsoft Wi ...

  4. delphi cmd

    今天看到有人在问用代码执行CMD命令的问题,就总结一下用法,也算做个备忘. Delphi中,执行命令或者运行一个程序有2个函数,一个是winexec,一个是shellexecute.这两个大家应该都见 ...

  5. Delphi Dll 动态调用例子(3)-仔细看一下

    http://blog.163.com/bxf_0011/blog/static/35420330200952075114318/ Delphi 动态链接库的动态和静态调用 为了让人能快速的理解 静态 ...

  6. 解决每次从cmd进入sqlplus,都得重新设置pagesize、linesize的问题

    https://blog.csdn.net/u012127798/article/details/34146143/ Oracle里的set零零碎碎的,这里整理归纳一下 SQL> set tim ...

  7. Delphi 操作Flash D7~XE10都有 导入Activex控件 shockwave

    http://www.cnblogs.com/devcjq/articles/2906224.html Flash是Macromedia公司出品的,用在互联网上动态的.可互动的shockwave.它的 ...

  8. 转:Delphi 回调函数及例子

    http://anony3721.blog.163.com/blog/static/5119742010866050589/ { http://anony3721.blog.163.com/blog/ ...

  9. Windows自带的驱动程序例子都在哪里?

    MSDN官方说明:https://msdn.microsoft.com/windows/hardware/drivers/samples/index 各个操作系统驱动例子: Windows10  :h ...

随机推荐

  1. Flex中怎么给表格中的滚动栏定位

    1.问题背景 假设表格中的字段过多,会出现滚动栏,在将滚动栏滚到一定的位置时,又一次刷新表格.滚动栏会回到原处,原来查看的字段还得继续滚动,才干查看到. 2.实现实例 <? xml versio ...

  2. hdu1198Farm Irrigation (DFS)

    Problem Description Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is ...

  3. <Win32_18>平滑的人物走动 —— 解决闪屏

    今天咋一看,发现很久没写博客了 的确,开学之后,写博客的时间越来越少了…… 今天来做一个比较实用的小应用——平滑的人物走动,同时解决常见的闪屏问题.实现透明位图 这些技术在游戏开发中是很常见的 --- ...

  4. CSS实现强制换行-------Day 78

    事实上最早的时候也考虑过这个问题,当时还在想须要判定文字的长度么,实在是傻到极点了,原来CSS中本来就有这个样式设置的.而今天正好看到了有这么一篇介绍.细致看了下,感觉还不错,这里也把实验的结果记录下 ...

  5. PHP - 接口 - 单一接口

    /* * 接口的使用 */ //定义接口 interface IPerosn{ public function eat(); public function water(); } //定义继承自接口的 ...

  6. 云计算:创业的好时机——上海够快网络科技有限公司总经理蒋烁淼专访(评价阿里云的OSS的4个优点)(够快科技正式宣布已成功挂牌新三板)

    云存储是云计算目前的热点之一,Dropbox.Box等产品的风靡,公司因此获得极高估值,都印证了这一点.但云存储对技术和资金要求都比较高,竞争也非常激烈,挑战巨大.国外云存储公司有亚马逊的云平台作为支 ...

  7. __sleep和__wakeup

    魔术方法__sleep和__wakeup 串行化serialize可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据. ...

  8. Juuluu 旗下企业站点管理系统3.0.1公布!

    KgE金刚企业站点管理系统是广州聚龙软件为国内中小企业开发的一款企业站点管理系统,KgE採用可视化的标签模型,可在Dreamvear等网页编辑下可视化编辑,KgE使用javaeemsyqlyuijqu ...

  9. gcc configure: error: Building GCC requires GMP 4.2+, MPFR 2.3.1+ and MPC 0.8.0

    从svn checkout svn://gcc.gnu.org/svn/gcc/trunk拿了GCC的最新代码,打算编译了学东西习学习C++ 11的东西,结果在configure的时候出现例如以下问题 ...

  10. [置顶] 用mootools实现checkbox全选功能

    全选时,所有的单个checkbox都要选中,反过来也可以实现 //全选按钮 $('chkall').addEvent('click',function(){ $$('input[name=" ...