关于DELPHI调用外部可执行程序的问题....急...100分求救. ( 积分: 100 )

  • 主题发起人 主题发起人 yonge23
  • 开始时间 开始时间
Y

yonge23

Unregistered / Unconfirmed
GUEST, unregistred user!
我有个&quot;001.C&quot;的文件:<br>#include &lt;stdio.h&gt;<br>#include &lt;math.h&gt;<br>const g=10;<br>main()<br>{<br> int a,b,c;<br> printf(&quot; &nbsp; A= &quot;);<br> scanf(&quot;%d&quot;,&amp;a);<br> printf(&quot; &nbsp; B= &quot;);<br> scanf(&quot;%d&quot;,&amp;b);<br> c=a+b;<br> printf(&quot; A+B = %d/n&quot;,c);<br>}<br><br>我做的是程序设计实验平台...C语言程序是学生提交给系统的.<br>我现在想用DELPHI来测试该程序是否正确..<br><br>首先我先利用TURBOC的TCC.EXE对&quot;001.C&quot;进行编译.使之生成&quot;001.EXE&quot;可执行文件.我用如下方法:<br>ShellExecute(Handle, 'open', PChar('command.com'), PChar('/c C:/turboc2/tcc -e001 001.c &nbsp;&gt;p.txt'), nil, SW_SHOW);<br>这步可以成功解决了,也可以正确地生成可执行程序&quot;001.EXE&quot;.<br><br>接下来,我要调用&quot;001.EXE&quot;进行测试了.<br>我用如下方法:<br>ShellExecute(Handle, 'open', PChar('command.com'), PChar('/c 001 &nbsp;&gt;p1.txt'), nil, SW_SHOW);<br>这样,就没办法让DELPHI程序自动传递测试数据进去.<br>只能通过手动从键盘上输入.<br><br>有哪位大哥能帮我解决测试数据直接从DELPHI程序传递进去.<br><br>比如我要测试1+2.那么我就要把1,2两个参数通过DELPHI程序传递进去.<br>具体要怎么做~?!<br><br>不知道我能否把问题描述清楚...如果有不清楚的再说...
 
我有个&quot;001.C&quot;的文件:<br>#include &lt;stdio.h&gt;<br>#include &lt;math.h&gt;<br>const g=10;<br>main()<br>{<br> int a,b,c;<br> printf(&quot; &nbsp; A= &quot;);<br> scanf(&quot;%d&quot;,&amp;a);<br> printf(&quot; &nbsp; B= &quot;);<br> scanf(&quot;%d&quot;,&amp;b);<br> c=a+b;<br> printf(&quot; A+B = %d/n&quot;,c);<br>}<br><br>我做的是程序设计实验平台...C语言程序是学生提交给系统的.<br>我现在想用DELPHI来测试该程序是否正确..<br><br>首先我先利用TURBOC的TCC.EXE对&quot;001.C&quot;进行编译.使之生成&quot;001.EXE&quot;可执行文件.我用如下方法:<br>ShellExecute(Handle, 'open', PChar('command.com'), PChar('/c C:/turboc2/tcc -e001 001.c &nbsp;&gt;p.txt'), nil, SW_SHOW);<br>这步可以成功解决了,也可以正确地生成可执行程序&quot;001.EXE&quot;.<br><br>接下来,我要调用&quot;001.EXE&quot;进行测试了.<br>我用如下方法:<br>ShellExecute(Handle, 'open', PChar('command.com'), PChar('/c 001 &nbsp;&gt;p1.txt'), nil, SW_SHOW);<br>这样,就没办法让DELPHI程序自动传递测试数据进去.<br>只能通过手动从键盘上输入.<br><br>有哪位大哥能帮我解决测试数据直接从DELPHI程序传递进去.<br><br>比如我要测试1+2.那么我就要把1,2两个参数通过DELPHI程序传递进去.<br>具体要怎么做~?!<br><br>不知道我能否把问题描述清楚...如果有不清楚的再说...
 
郁闷 “&gt;”输出符号在ShellExecute()里不能解析。。查不到为什么[:(]
 
明白你的意思 对这方面不是很熟悉<br>不过 有个问题想问你一下 你在PChar中输入“&gt;p1.txt'”<br>是什么意思 不是很懂
 
&gt;p1.txt'<br><br>是把命令行的显示出来的东西保存到 p1.txt 文件中..
 
‘&gt;’是重定向,DOS下面的东东。楼主可以用重定向命令输入 ‘&lt;’,从文件里把要测试的数据输进去,而不是通过提示符窗口,资料如下:<br>--------------------------------------------------------------------------------<br>使用命令重定向操作符 (Redirection Operators)可以使用重定向操作符将命令输入和输出数据流从默认位置重定向到不同的位置。输入或输出数据流的位置即为句柄。<br><br>下表列出了可用于将命令输入和输出数据流进行重定向的操作符。<br><br>重定向操作符 说明 <br>&gt; 将命令输出写入到文件或设备(例如打印机)中,而不是写在命令提示符窗口中。 <br>&lt; 从文件中而不是从键盘中读入命令输入。 <br>&gt;&gt; 将命令输出添加到文件末尾而不删除文件中的信息。 <br>&gt;&amp; 将一个句柄的输出写入到另一个句柄的输入中。 <br>&lt;&amp; 从一个句柄读取输入并将其写入到另一个句柄输出中。 <br>| 从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。 <br><br>默认情况下,可以从键盘将命令输入(即 STDIN 句柄)发送到 Cmd.exe,然后由 Cmd.exe 将命令输出(即 STDOUT 句柄)发送到命令提示符窗口。<br><br>下表将列出可用的句柄。<br><br>句柄 句柄的数字代号 说明 <br>STDIN 0 键盘输入 <br>STDOUT 1 输出到命令提示符窗口 <br>STDERR 2 错误输出到命令提示符窗口 <br>UNDEFINED 3-9 这些句柄由应用程序和各个具体工具单独定义。 <br><br>数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序并将前 10 个句柄中的任何一个重定向到该程序。要指定想使用的句柄,可在重定向操作符前面键入该句柄的数字。如果未定义句柄,则默认的 &lt; 重定向输入操作符是 0,而默认的 &gt; 重定向输出操作符是 1。键入 &gt; 或 &lt; 操作符之后,必须指定要读取或写入数据的位置。可以指定文件名或另一个现有的句柄。<br><br>要指定重定向到现有句柄,请使用与 (&amp;) 字符,后面接要重定向的句柄号(例如 &amp;句柄#)。例如,下面的命令可以将句柄 2(即 STDERR)重定向到句柄 1(即 STDOUT):<br><br>1&lt;&amp;2<br><br>复制句柄 <br>重定向操作符 &amp; 可以将输出或输入从一个句柄复制到另一个指定的句柄。例如,要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt,请键入:<br><br>dir&gt;c:/file.txt 2&gt;&amp;1<br><br>复制句柄时,可以复制该句柄原状态的所有特性。例如,如果一个句柄具有只读访问的属性,则该句柄的所有副本都具有只读访问属性。不能将一个具有只读访问属性的句柄复制为另一个具有只写访问属性的句柄。<br><br>重定向命令输出 (&lt;)<br>要从键盘或设备重定向命令输出,请使用 &lt; 操作符。例如,要从 File.txt 得到 sort 命令的命令输入,请键入: <br><br>sort&lt;file.txt <br><br>File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。<br><br>&lt; 操作符可以打开具有只读访问的指定文件名。所以,不能使用该操作符向文件中写入信息。例如,如果以 &lt;&amp;2 启动程序,则所有试图读取句柄 0 的操作都将失败,因为句柄 2 最初是以只读访问打开的。<br><br> 注意<br><br>0 是 &lt; 重定向输入操作符 &gt; 的默认句柄。 <br>重定向命令输出 (&gt;)<br>几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的命令也会在命令提示符窗口显示消息和提示。<br><br>要将命令输出从命令提示符窗口重定向到文件或设备,请使用 &gt; 操作符。可以在许多命令中使用该操作符。例如,要将 dir 输出重定向到 Dirlist.txt,请键入: <br><br>dir&gt;dirlist.txt <br><br>如果 Dirlist.txt 不存在,Cmd.exe 将创建该文件。如果 Dirlist.txt 存在,Cmd.exe 将使用 dir 命令的输出替换文件中的信息。<br><br>要运行 netsh routing dump 命令,然后将命令输出发送到 Route.cfg,请键入:<br><br>netsh routing dump&gt;c:/route.cfg<br><br>&gt; 操作符可以打开具有只写访问属性的指定文件。所以,不能使用该操作符读取文件。例如,如果使用重定向 &gt;&amp;0 启动程序,则所有试图写入句柄 1 的操作都将失败,因为句柄 0 最初是以只读访问大开的。<br><br> 注意<br><br>1 是 &gt; 重定向输出操作符的默认句柄。 <br>使用 &lt;&amp; 操作符重定向输入和复制<br>要使用重定向输入操作符 &lt;&amp;,指定的文件必须已经存在。如果输入文件存在,Cmd.exe 将以只读方式打开该文件,然后将文件中作为输入的字符发送到此命令(如同从键盘输入一样)。如果指定了句柄,Cmd.exe 将指定的句柄复制到系统现有的句柄中。<br><br>例如,要以句柄 0 输入读取(即 STDIN)的方式打开 File.txt,请键入:<br><br>&lt;file.txt<br><br>要打开 File.txt,并在内容分类后将输出发送到命令提示符窗口(即 STDOUT),请键入:<br><br>sort&lt;file.txt <br><br>要查找 File.txt,然后将句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到 Search.txt,请键入:<br><br>findfile file.txt&gt;search.txt 2&lt;&amp;1<br><br>要以句柄 0 输入读取(即 STDIN)的方式复制用户定义句柄 3,请键入:<br><br>&lt;&amp;3<br><br>使用 &gt;&amp; 操作符重定向输出和复制<br>如果将输出重定向到文件且指定了现有的文件名,Cmd.exe 将以只写方式打开文件并覆盖该文件内容。如果指定了句柄,Cmd.exe 将文件复制到现有句柄中。<br><br>要将用户定义句柄 3 复制到句柄 1,请键入:<br><br>&gt;&amp;3<br><br>要将包括句柄 2(即 STDERR)的所有输出从 ipconfig 命令重定向到句柄 1(即 STDOUT),然后将输出重定向到 Output.log,请键入:<br><br>ipconfig.exe&gt;&gt;output.log 2&gt;&amp;1<br><br>使用 &gt;&gt; 重定向操作符追加输出<br>要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息,请使用两个连续的大于号(即 &gt;&gt;)。例如,下面的命令可以将由 dir 命令生成的目录列表追加到 Dirlist.txt 文件: <br><br>dir&gt;&gt;dirlist.txt <br><br>要将 netstat 命令的输出追加到 Tcpinfo.txt 的末尾,请键入:<br><br>netstat&gt;&gt;tcpinfo.txt<br><br>使用管道操作符 (|) <br>管道操作符 (|) 可以提取一个命令的输出(默认情况下是 STDOUT),然后将其导入另一个命令的输入中(默认情况下是 STDIN)。例如,下面的命令将对目录分类:<br><br>dir | sort<br><br>在本例中,将同时启动两个命令,但随后 sort 命令会暂停,直到它接收到 dir 命令的输出为止。sort 命令使用 dir 命令的输出作为输入,然后将输出发送到句柄 1(即 STDOUT)。<br><br>合并带重定向操作符的命令<br>可以通过合并带有其它命令和文件名的筛选器命令创建自定义命令。例如,可以使用以下命令存储包含“LOG”字符串的文件名: <br><br>dir /b | find &quot;LOG&quot; &gt; loglist.txt <br><br>dir 命令的输出通过 find 筛选器命令发送。包含字符串 &quot;LOG&quot; 的文件名作为文件名列表(例如,NetshConfig.log、Logdat.svd 和 Mylog.bat)存储在文件 Loglist.txt 中。 <br><br>要在相同命令中使用多个筛选器,请使用管道 (|) 分隔筛选器。例如,下面的命令将搜索 C 盘上的每个目录以查找包含 &quot;LOG&quot; 字符串的文件名,并且在命令提示符窗口中每次显示一屏:<br><br>dir c:/ /s /b | find &quot;LOG&quot; | more <br><br>利用管道 (|) 可以将 Cmd.exe 导向为通过 find 筛选器命令发送 dir 命令输出。find 命令只选择包含字符串 &quot;LOG&quot; 的文件名。more 命令可以显示由 find 命令选择的文件名(在命令提示符窗口中每次显示一屏)。有关筛选器命令的详细信息,请参阅筛选器命令。
 
ShellExecute(Handle, 'open', PChar('command.com'), PChar('/c 001 &nbsp;&gt;p1.txt &lt;p2.txt'), nil, SW_SHOW);
 
两种办法:<br>1、你的C写的DOS程序必须支持命令行,这样你就可以把你的那个算式当作命令行参数<br> &nbsp; 直接传给它。<br>2、Delphi先生成一个含有该算式的文件(什么格式你自己定),然后外部调用DOS程序时<br> &nbsp; 叫它读。(这其实也要求DOS程序支持命令行,否则怎么叫它读呢 :) )<br><br>你给的那个C代码,对于外部调用来说,它是不会听你任何事情的,你只能启动它。<br><br>3、还有一个烂招:外部调用后,对该DOS窗口实施模拟键盘输入,效果就象用户击键<br> &nbsp; 操作一样。<br><br>提醒一句:你那个管道操作符,在ShellExecute中是不管用的,什么原因我也不清楚。<br>只能用Delphi程序生成一个批文件,然后执行批文件。
 
如果 Dirlist.txt 不存在,Cmd.exe 将创建该文件。如果 Dirlist.txt 存在,Cmd.exe 将使用 dir 命令的输出替换文件中的信息。<br><br>要运行 netsh routing dump 命令,然后将命令输出发送到 Route.cfg,请键入:<br><br>netsh routing dump&gt;c:/route.cfg<br><br>&gt; 操作符可以打开具有只写访问属性的指定文件。所以,不能使用该操作符读取文件。例如,如果使用重定向 &gt;&amp;0 启动程序,则所有试图写入句柄 1 的操作都将失败,因为句柄 0 最初是以只读访问大开的。<br><br> 注意<br><br>1 是 &gt; 重定向输出操作符的默认句柄。 <br>使用 &lt;&amp; 操作符重定向输入和复制<br>要使用重定向输入操作符 &lt;&amp;,指定的文件必须已经存在。如果输入文件存在,Cmd.exe 将以只读方式打开该文件,然后将文件中作为输入的字符发送到此命令(如同从键盘输入一样)。如果指定了句柄,Cmd.exe 将指定的句柄复制到系统现有的句柄中。<br><br>例如,要以句柄 0 输入读取(即 STDIN)的方式打开 File.txt,请键入:<br><br>&lt;file.txt<br><br>要打开 File.txt,并在内容分类后将输出发送到命令提示符窗口(即 STDOUT),请键入:<br><br>sort&lt;file.txt <br><br>要查找 File.txt,然后将句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到 Search.txt,请键入:<br><br>findfile file.txt&gt;search.txt 2&lt;&amp;1<br><br>要以句柄 0 输入读取(即 STDIN)的方式复制用户定义句柄 3,请键入:<br><br>&lt;&amp;3
 
如果我用:<br>ShellExecute(Handle, 'open', PChar('command.com'), PChar('/c 001 &lt;input.txt &gt;p1.txt'), nil, SW_SHOW);<br><br><br>但是001.EXE出现死循环.我怎么在DELPHI中在结束001.EXE的运行.比如说只想让001.EXE运行5秒!<br><br>这要怎么做!?
 
你可以用CreateProcess。<br>运行后开始计时,如果5秒到了,进程还在就 TerminateProcess
 
但是我用的是:ShellExecute<br><br>那要怎么使我调用的程序只运行5秒!?
 
CreateProcess同样可以达到ShellExecute的效果啊。<br>给个例子,你参考。<br>Function WinExecExW(cmd,workdir:pchar;visiable:integer):DWORD;<br>var<br> StartupInfo:TStartupInfo;<br> ProcessInfo:TProcessInformation;<br>begin<br> FillChar(StartupInfo,SizeOf(StartupInfo),#0);<br> StartupInfo.cb:=SizeOf(StartupInfo);<br> StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;<br> StartupInfo.wShowWindow:=visiable;<br> if not CreateProcess(nil,cmd,nil,nil,false,Create_new_console or Normal_priority_class,nil,nil,StartupInfo,ProcessInfo) then<br> &nbsp; result:=0<br> else<br> begin<br> &nbsp; waitforsingleobject(processinfo.hProcess,INFINITE);<br> &nbsp; GetExitCodeProcess(ProcessInfo.hProcess,Result);<br> end;<br>end;
 
楼上的似乎都在答非所问。。<br>没写程序测试过的不要乱灌水嘛<br>现在关键是delphi里面调用ShellExecute时“调用参数”这个值里如果含有“&gt;”符号,它后面的命令都不会被执行,最简单可以用<br>fc /B 1.jpg 2.jpg &gt;0.txt<br>来做测试<br>哪位能解释一下为什么“&gt;”符号在参数里面不能被正确执行?
 
ShellExecute(Handle, 'open', PChar('command.com'), PChar('/c 001 &lt;input.txt &gt;p1.txt'), nil, SW_SHOW);<br>这样我已经测试过了,是可以正常调用外部程序的.而且也能够正确读取数据和输出的.<br><br>但我现在的意思是说.如果学生提交上来的C程序001.C是个逻辑上错误的程序.比如说程序中含有死循环,那么我就要控制外部程序001.EXE的运行时间了,如果外部程序的运行超过5秒就认为001.EXE是个错误的程序.那么就得结束001.EXE,不让它继续运行.<br><br>这要怎么做!?
 
function RunAndWait5Sec: Boolean;<br>var<br> &nbsp;StartupInfo: TStartupInfo;<br> &nbsp;ProcessInfo: TProcessInformation;<br>begin<br> &nbsp;Result &nbsp; &nbsp; &nbsp; &nbsp;:= True;<br> &nbsp;FillChar(StartupInfo,SizeOf(StartupInfo),#0);<br> &nbsp;StartupInfo.cb:=SizeOf(StartupInfo);<br> &nbsp;StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;<br> &nbsp;StartupInfo.wShowWindow:= SW_SHOWNORMAL;<br> &nbsp;if not CreateProcess(<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PChar('Command.Com'),PChar('/c 001 &lt;input.txt &gt;p1.txt'),nil,nil,<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;False,Create_new_console or Normal_priority_class,<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nil,nil,StartupInfo,ProcessInfo<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ) then<br> &nbsp; &nbsp;Result := False<br> &nbsp;else &nbsp;begin<br> &nbsp; &nbsp;if Waitforsingleobject(processinfo.hProcess,5000) = WAIT_TIMEOUT &nbsp;then begin<br> &nbsp; &nbsp; &nbsp; TerminateProcess(processinfo.hProcess,0);<br> &nbsp; &nbsp; &nbsp; Result &nbsp; := False;<br> &nbsp; &nbsp;end;<br> &nbsp;end;<br>end;<br><br>用上面函数代替你的<br>ShellExecute(Handle, 'open', PChar('command.com'), PChar('/c 001 &lt;input.txt &gt;p1.txt'), nil, SW_SHOW);<br>返回值为是否是:是否正常结束
 
function RunAndWait5Sec: Boolean;<br>var<br> &nbsp;StartupInfo: TStartupInfo;<br> &nbsp;ProcessInfo: TProcessInformation;<br>begin<br> &nbsp;Result &nbsp; &nbsp; &nbsp; &nbsp;:= True;<br> &nbsp;FillChar(StartupInfo,SizeOf(StartupInfo),#0);<br> &nbsp;StartupInfo.cb:=SizeOf(StartupInfo);<br> &nbsp;StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;<br> &nbsp;StartupInfo.wShowWindow:= SW_SHOWNORMAL;<br> &nbsp;if not CreateProcess(<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PChar('Command.Com'),PChar('/c 123 &lt;1.txt&gt;p1.txt'),nil,nil,<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;False,Create_new_console or Normal_priority_class,<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nil,nil,StartupInfo,ProcessInfo<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ) then<br> &nbsp;begin<br> &nbsp; &nbsp;Result := False;<br> &nbsp; &nbsp;showmessage('创建进程不成功');<br> &nbsp;end<br> &nbsp;else &nbsp;begin<br> &nbsp; &nbsp;if Waitforsingleobject(processinfo.hProcess,5000) = WAIT_TIMEOUT &nbsp;then begin<br> &nbsp; &nbsp; &nbsp; TerminateProcess(processinfo.hProcess,0);<br> &nbsp; &nbsp; &nbsp; Result &nbsp; := False;<br> &nbsp; &nbsp; &nbsp; showmessage('程序执行超时.');<br> &nbsp; &nbsp;end<br> &nbsp; &nbsp;else<br> &nbsp; &nbsp;showmessage('一切正常');<br> &nbsp;end;<br>end;.<br><br><br>经过测试,好像有问题.<br>PChar('/c 123 &lt;1.txt&gt;p1.txt'),这是根据我的测试文件写的,没问题.<br>可是,<br>我运行的时候,不管123.EXE可执行程序是否有死循环,测试结果均为:<br>showmessage('创建进程不成功');显示创建进程不成功.<br><br>这是为什么,哪有错吗!?
 
给楼主提供个思路,测试程序后进入循环,间隔一段时间查询cmd.exe进程,如果5秒内查询到cmd.exe进程停止则正常,否则错误并结束cmd.exe进程。
 
测试通过......楼主加上自己的代码试试<br><br><br>unit Unit1111;<br><br>interface<br><br>uses<br> &nbsp;Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br> &nbsp;Dialogs,tlhelp32, StdCtrls;<br><br>type<br> &nbsp;TForm1 = class(TForm)<br> &nbsp; &nbsp;Button1: TButton;<br> &nbsp; &nbsp;procedure Button1Click(Sender: TObject);<br> &nbsp;private<br> &nbsp; &nbsp;{ Private declarations }<br> &nbsp;public<br> &nbsp; &nbsp;{ Public declarations }<br> &nbsp;end;<br> &nbsp;procedure FindProcess(const AFilename:string;const PathMatch:Boolean;var ProcessID:<br> &nbsp; &nbsp;DWORD);<br><br>var<br> &nbsp;Form1: TForm1;<br><br>implementation<br><br>{$R *.dfm}<br><br>procedure FindProcess(const AFilename:string;const PathMatch:Boolean;var ProcessID:<br> &nbsp; &nbsp; &nbsp; DWORD);<br> &nbsp; &nbsp; &nbsp; //AFilename为要查找进程的文件名(可以包括路径)<br> &nbsp; &nbsp; &nbsp; //pathMatch 表示查找的时候是否匹配路径<br>var<br> &nbsp; lppe:TProcessEntry32;<br> &nbsp; SsHandle:Thandle;<br> &nbsp; FoundAProc,FoundOK:boolean;<br>begin<br> &nbsp; ProcessID:=0;<br> &nbsp; //创建系统快照<br> &nbsp; SsHandle:=CreateToolHelp32SnapShot(TH32CS_SnapProcess,0);<br> &nbsp; //第一个进程<br> &nbsp; FoundAProc:=Process32First(Sshandle,lppe);<br> &nbsp; //列举所有运行进程,匹配指定的文件名<br> &nbsp; while FoundAProc do<br> &nbsp; begin<br> &nbsp; &nbsp; if PathMatch then<br> &nbsp; &nbsp; &nbsp; &nbsp;FoundOK:=AnsiStrComp(lppe.szExefile,PChar(AFilename))=0<br> &nbsp; &nbsp; else<br> &nbsp; &nbsp; &nbsp; &nbsp;FoundOK:=AnsiStrcomp(PChar(ExtractFilename(lppe.szExeFile)),<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PChar(ExtractFilename(AFilename)))=0;<br> &nbsp; &nbsp; if FoundOK then<br> &nbsp; &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp; &nbsp;ProcessID:=lppe.th32ProcessID;<br> &nbsp; &nbsp; &nbsp; &nbsp;break;<br> &nbsp; &nbsp; &nbsp;end;<br> &nbsp; &nbsp; &nbsp;FoundAProc:=Process32Next(Sshandle,lppe);<br> &nbsp; end;<br> &nbsp; CloseHandle(Sshandle);<br>end;<br><br>procedure KillProcess(dwProcessId: DWORD);<br>var<br> &nbsp;ProcHandle: THandle;<br>begin<br> &nbsp;ProcHandle := OpenProcess(1, FALSE, dwProcessID);<br> &nbsp;try<br> &nbsp; &nbsp;if ProcHandle &lt;&gt; 0 then<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;if TerminateProcess(ProcHandle, $FFFFFFFF) then<br> &nbsp; &nbsp; &nbsp; &nbsp;WaitForSingleObject(ProcHandle, INFINITE);<br> &nbsp; &nbsp;end;<br> &nbsp;finally<br> &nbsp; &nbsp;CloseHandle(ProcHandle);<br> &nbsp;end;<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br> &nbsp;i: Integer;<br> &nbsp;ProcessID: DWord;<br>begin<br> &nbsp;try<br> &nbsp; &nbsp;{ShellExecute(Handle, 'open', PChar('command.com'),<br> &nbsp; &nbsp; &nbsp;PChar('/c 001 &lt;input.txt &gt;p1.txt'), nil, SW_SHOW); }<br> &nbsp; &nbsp;for i := 1 to 50 do<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;ProcessID := 0;<br> &nbsp; &nbsp; &nbsp;FindProcess('ntvdm.exe', False, ProcessID);<br> &nbsp; &nbsp; &nbsp;if ProcessID = 0{and FileExists('c:/p1.txt')} then<br> &nbsp; &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp; &nbsp;ShowMessage('测试成功!');<br> &nbsp; &nbsp; &nbsp; &nbsp;exit;<br> &nbsp; &nbsp; &nbsp;end<br> &nbsp; &nbsp; &nbsp;else Sleep(100);<br> &nbsp; &nbsp;end;<br> &nbsp; &nbsp;ShowMessage('测试失败!');<br> &nbsp; &nbsp;KillProcess(ProcessID);<br> &nbsp;except<br> &nbsp; &nbsp;raise Exception.Create('测试出错!');<br> &nbsp;end;<br>end;<br><br>end.
 
谢谢各位...
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
725
import
I
后退
顶部