delphi cmd(4个例子都是通过管道取得)
- //K8执行DOS并返回结果
- function RunDosCommand(Command: string): string;
- var
- hReadPipe: THandle;
- hWritePipe: THandle;
- SI: TStartUpInfo;
- PI: TProcessInformation;
- SA: TSecurityAttributes;
- // SD : TSecurityDescriptor;
- BytesRead: DWORD;
- Dest: array[0..1023] of char;
- CmdLine: array[0..512] of char;
- TmpList: TStringList;
- Avail, ExitCode, wrResult: DWORD;
- osVer: TOSVERSIONINFO;
- tmpstr: string;
- begin
- osVer.dwOSVersionInfoSize := Sizeof(TOSVERSIONINFO);
- GetVersionEX(osVer);
- if osVer.dwPlatformId = VER_PLATFORM_WIN32_NT then
- begin
- // InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION);
- // SetSecurityDescriptorDacl(@SD, True, nil, False);
- SA.nLength := SizeOf(SA);
- SA.lpSecurityDescriptor := nil; //@SD;
- SA.bInheritHandle := True;
- CreatePipe(hReadPipe, hWritePipe, @SA, 0);
- end
- else
- CreatePipe(hReadPipe, hWritePipe, nil, 1024);
- try
- FillChar(SI, SizeOf(SI), 0);
- SI.cb := SizeOf(TStartUpInfo);
- SI.wShowWindow := SW_HIDE;
- SI.dwFlags := STARTF_USESHOWWINDOW;
- SI.dwFlags := SI.dwFlags or STARTF_USESTDHANDLES;
- SI.hStdOutput := hWritePipe;
- SI.hStdError := hWritePipe;
- StrPCopy(CmdLine, Command);
- if CreateProcess(nil, CmdLine, nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil, SI, PI) then
- begin
- ExitCode := 0;
- while ExitCode = 0 do
- begin
- wrResult := WaitForSingleObject(PI.hProcess, 500);
- // if PeekNamedPipe(hReadPipe, nil, 0, nil, @Avail, nil) then
- if PeekNamedPipe(hReadPipe, @Dest[0], 1024, @Avail, nil, nil) then
- begin
- if Avail > 0 then
- begin
- TmpList := TStringList.Create;
- try
- FillChar(Dest, SizeOf(Dest), 0);
- ReadFile(hReadPipe, Dest[0], Avail, BytesRead, nil);
- TmpStr := Copy(Dest, 0, BytesRead - 1);
- TmpList.Text := TmpStr;
- Result := tmpstr;
- finally
- TmpList.Free;
- end;
- end;
- end;
- if wrResult <> WAIT_TIMEOUT then ExitCode := 1;
- end;
- GetExitCodeProcess(PI.hProcess, ExitCode);
- CloseHandle(PI.hProcess);
- CloseHandle(PI.hThread);
- end;
- finally
- CloseHandle(hReadPipe);
- CloseHandle(hWritePipe);
- end;
- end;
- //002
- function RunCommand(const cmd: string): string;
- var
- hReadPipe,hWritePipe:THandle;
- si:STARTUPINFO;
- lsa:SECURITY_ATTRIBUTES;
- pi:PROCESS_INFORMATION;
- cchReadBuffer:DWORD;
- pOutStr, pCMD:PChar;
- res, strCMD:string;
- begin
- strcmd := 'cmd.exe /k ' + cmd;
- pOutStr := AllocMem(5000);
- lsa.nLength := SizeOf(SECURITY_ATTRIBUTES);
- lsa.lpSecurityDescriptor := nil;
- lsa.bInheritHandle := True;
- if not CreatePipe(hReadPipe, hWritePipe, @lsa, 0) then Exit;
- FillChar(si, SizeOf(STARTUPINFO), 0);
- si.cb:=sizeof(STARTUPINFO);
- si.dwFlags:=(STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW);
- si.wShowWindow:=SW_HIDE;
- si.hStdOutput:=hWritePipe;
- if not CreateProcess(nil, PChar(strCMD), nil, nil, true, 0, nil, nil, si, pi) then Exit;
- while(true) do
- begin
- if not PeekNamedPipe(hReadPipe, pOutStr, 1, @cchReadBuffer, nil, nil) then break;
- if cchReadBuffer <> 0 then
- begin
- if not ReadFile(hReadPipe, pOutStr^, 4096, cchReadBuffer, nil) then break;
- pOutStr[cchReadbuffer]:=chr(0);
- //if @Show <> nil then Show(pOutStr);
- res := res + pOutStr;
- end else if(WaitForSingleObject(pi.hProcess ,0) = WAIT_OBJECT_0) then break;
- Sleep(10);
- Application.ProcessMessages;
- end;
- pOutStr[cchReadBuffer]:=chr(0);
- CloseHandle(hReadPipe);
- CloseHandle(pi.hThread);
- CloseHandle(pi.hProcess);
- CloseHandle(hWritePipe);
- FreeMem(pOutStr);
- Result := res;
- end;
- //003
- procedure CmdExecAndView(FileName: string; memo: TMemo);
- procedure _AddInfo(mmInfo:TMemo; S: string; var line: string);
- var
- i, p: Integer;
- begin
- if mmInfo.Lines.Count > 800 then
- mmInfo.Lines.Clear;
- //去掉 \r
- for i := 0 to Length(S) - 1 do
- if S[i] = #13 then S[i] := ' ';
- line := line + S;
- // \n 断行
- p := Pos(#10, line);
- if p > 0 then
- begin
- // \n 前面的加入一行,后面的留到下次
- mmInfo.Lines.Add(Copy(line, 1, p - 1));
- line := Copy(line, p + 1, Length(line) - p);
- end;
- end;
- var
- hReadPipe, hWritePipe: THandle;
- si: STARTUPINFO;
- lsa: SECURITY_ATTRIBUTES;
- pi: PROCESS_INFORMATION;
- cchReadBuffer: DWORD;
- ph: PChar;
- fname: PChar;
- line: string;
- begin
- fname := allocmem(1024);
- ph := AllocMem(1024);
- lsa.nLength := sizeof(SECURITY_ATTRIBUTES);
- lsa.lpSecurityDescriptor := nil;
- lsa.bInheritHandle := True;
- if CreatePipe(hReadPipe, hWritePipe, @lsa, 0) = false then
- Exit;
- fillchar(si, sizeof(STARTUPINFO), 0);
- si.cb := sizeof(STARTUPINFO);
- si.dwFlags := (STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW);
- si.wShowWindow := SW_HIDE;
- si.hStdOutput := hWritePipe;
- si.hStdError := hWritePipe;
- StrPCopy(fname, FileName);
- if CreateProcess(nil, fname, nil, nil, true, 0, nil, nil, si, pi) = False then
- begin
- FreeMem(ph);
- FreeMem(fname);
- Exit;
- end;
- CloseHandle(hWritePipe);
- while (true) do
- begin
- if not PeekNamedPipe(hReadPipe, ph, 1, @cchReadBuffer, nil, nil) then break;
- if cchReadBuffer <> 0 then
- begin
- if ReadFile(hReadPipe, ph^, 512, cchReadBuffer, nil) = false then break;
- ph[cchReadbuffer] := chr(0);
- _AddInfo(memo, ph, line);
- end
- else if (WaitForSingleObject(pi.hProcess, 0) = WAIT_OBJECT_0) then break;
- Application.ProcessMessages;
- Sleep(200);
- end;
- ph[cchReadBuffer] := chr(0);
- _AddInfo(memo, ph, line);
- CloseHandle(hReadPipe);
- CloseHandle(pi.hThread);
- CloseHandle(pi.hProcess);
- FreeMem(ph);
- FreeMem(fname);
- end;
- //004
- var
- hReadPipe,hWritePipe:THandle;
- si:STARTUPINFO;
- lsa:SECURITY_ATTRIBUTES;
- pi:PROCESS_INFORMATION;
- mDosScreen:String;
- cchReadBuffer:DWORD;
- ph:PChar;
- fname:PChar;
- i,j:integer;
- begin
- fname:=allocmem(255);
- ph:=AllocMem(5000);
- lsa.nLength :=sizeof(SECURITY_ATTRIBUTES);
- lsa.lpSecurityDescriptor :=nil;
- lsa.bInheritHandle :=True;
- if CreatePipe(hReadPipe,hWritePipe,@lsa,0)=false then
- begin
- ShowMessage('Can not create pipe!');
- exit;
- end;
- fillchar(si,sizeof(STARTUPINFO),0);
- si.cb :=sizeof(STARTUPINFO);
- si.dwFlags :=(STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW);
- si.wShowWindow :=SW_HIDE;
- si.hStdOutput :=hWritePipe;
- StrPCopy(fname,EditFilename.text);
- if CreateProcess( nil, fname, nil, nil, true, 0, nil, nil, si, pi) = False then
- begin
- ShowMessage('can not create process');
- FreeMem(ph);
- FreeMem(fname);
- Exit;
- end;
- while(true) do
- begin
- if not PeekNamedPipe(hReadPipe,ph,1,@cchReadBuffer,nil,nil) then break;
- if cchReadBuffer<>0 then
- begin
- if ReadFile(hReadPipe,ph^,4096,cchReadBuffer,nil)=false then break;
- ph[cchReadbuffer]:=chr(0);
- Memo1.Lines.Add(ph);
- end
- else if(WaitForSingleObject(pi.hProcess ,0)=WAIT_OBJECT_0) then break;
- Sleep(100);
- end;
- ph[cchReadBuffer]:=chr(0);
- Memo1.Lines.Add(WideCharToString(ph));
- CloseHandle(hReadPipe);
- CloseHandle(pi.hThread);
- CloseHandle(pi.hProcess);
- CloseHandle(hWritePipe);
- FreeMem(ph);
- FreeMem(fname);
- end;
http://blog.csdn.net/earbao/article/details/21160033
delphi cmd(4个例子都是通过管道取得)的更多相关文章
- Delphi完成的断点续传例子 转
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- delphi 三层架构简单例子(经测试成功)
delphi 三层架构简单例子(经测试成功) 转载 2013年12月19日 09:48:57 1100 所谓三层: (1) 客户端 (2) 服务器端 (3) 数据库 在数据访问时,使得客户端必须通过服 ...
- 和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧。因为,很多PCI的例子都是对S5933,就连微软出版的《Programming the Microsoft Windows Driver Model》都提供了一个完整的S5933的例子。 在这篇有关DDK的开发论文里。
和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧.因为,很多PCI的例子都是对S5933,就连微软出版的<Programming the Microsoft Wi ...
- delphi cmd
今天看到有人在问用代码执行CMD命令的问题,就总结一下用法,也算做个备忘. Delphi中,执行命令或者运行一个程序有2个函数,一个是winexec,一个是shellexecute.这两个大家应该都见 ...
- Delphi Dll 动态调用例子(3)-仔细看一下
http://blog.163.com/bxf_0011/blog/static/35420330200952075114318/ Delphi 动态链接库的动态和静态调用 为了让人能快速的理解 静态 ...
- 解决每次从cmd进入sqlplus,都得重新设置pagesize、linesize的问题
https://blog.csdn.net/u012127798/article/details/34146143/ Oracle里的set零零碎碎的,这里整理归纳一下 SQL> set tim ...
- Delphi 操作Flash D7~XE10都有 导入Activex控件 shockwave
http://www.cnblogs.com/devcjq/articles/2906224.html Flash是Macromedia公司出品的,用在互联网上动态的.可互动的shockwave.它的 ...
- 转:Delphi 回调函数及例子
http://anony3721.blog.163.com/blog/static/5119742010866050589/ { http://anony3721.blog.163.com/blog/ ...
- Windows自带的驱动程序例子都在哪里?
MSDN官方说明:https://msdn.microsoft.com/windows/hardware/drivers/samples/index 各个操作系统驱动例子: Windows10 :h ...
随机推荐
- C# - Environment类,获取桌面的路径
private void button1_Click(object sender, EventArgs e) { string Path = Environment.GetFolderPath(Env ...
- 如何使用springmvc的@requestbody 返回json数据
先配置 XXX_ servletxml <!-- 整合jackson 返回一个json格式 --><bean class="org.springframework.web. ...
- Swift - 后台获取数据(Background Fetch)的实现
前面讲了如何让程序申请后台短时运行.但这个额外延长的时间毕竟有限.所以从iOS7起又引入两种在后台运行任务的方式:后台获取和后台通知. 1,后台获取介绍 后台获取(Background Fetch)是 ...
- EasyUI - NumberBox组件
效果: html代码: <input type ="text" id ="box"/> JS代码: $(function () { $('#box' ...
- [置顶] 应广大童鞋的要求提供一个封装模块,直接和ADB 服务进程交互
很多童鞋在用ADB 的时候都是直接启动ADB 的进程,然后通过管道的方式获取输出,这样多个线程同时使用ADB 的时候任务管理器一闪一闪的,是不是很不爽啊,原先介绍过可以直接和ADB 服务进程通信,不用 ...
- Linux账号管理(一)
整理自<鸟哥的Linux私房菜>,整理者:华科小涛http://www.cnblogs.com/hust-ghtao/ 管理员的工作中,相当重要的一环就是“管理账号”.因为整个系统都是你在 ...
- JSP自定义标签——传统标签
同JSP标签一样,自定义标签主要用于移除JSP页面中的Java代码,可以看到我们在JSP中其实是禁止使用Java脚本的,任何要想通过Java代码实现的功能都必须以标签形式来处理,可以使用JSP标签,J ...
- ajax基础入门
补充一下Ajax的使用方法 //可以复制下面两种方法在百度上实验 //jquery的使用方法 $.ajax({ url:"index.php", success:function( ...
- 后台调用外部程序的完美实现(使用CreateDesktop建立隐藏桌面)
最近在做的一个软件,其中有一部分功能需要调用其它的软件来完成,而那个软件只有可执行文件,根本没有源代码,幸好,我要做的事不难,只需要在我的程序启动后,将那个软件打开,在需要的时候,对其中的一个文本矿设 ...
- uva 11400 Problem F Lighting System Design
紫皮书题: 题意:让你设计照明系统,给你n种灯泡,每种灯泡有所需电压,电源,每个灯泡的费用,以及每个灯泡所需的数量.每种灯泡所需的电源都是不同的,其中电压大的灯泡可以替换电压小的灯泡,要求求出最小费用 ...