如何用进程来控制程序的调用和关闭~?(200分)

  • 主题发起人 主题发起人 flyingQQ
  • 开始时间 开始时间
F

flyingQQ

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,我现在有一个程序A需要调用一个外来应用程序B,如果我直接采用shellexecute调
用B程序,但是我不知道如何去用程序来关闭这个B程序。
有人告诉我先创建一个进程,然后调用这个程序B,然后获取进程的句柄,然后关闭程序B,
可是我对进程一点都不懂,请大侠们伸出你们宝贵的援助之手吧~!


 
to flyingQQ:

有个方法不知道行不行,你试试看看!
你应该知道你要调用的外来程序的窗体名吧。就是那个caption.
用findwindow()找到该主窗体的句柄,然后发送一个关闭消息(WM_close)
给它,sendmessage(handle,wm_close,0,0),应该可以达到你的要求。
 
聽高手說﹗
 
创建进程:CreateProcess(PChar(sf),nil,nil,nil,false,0,nil,nil,StartUpInfo,ProcessInfo)
结束进程: TerminateProcess(ProcessInfo.hProcess,true);
 
to pcc_mmz1:
调用的外来程序不是显示在我的程序A的窗体里的,而是他自己会创建窗体,那这个caption就无从获得了~!
而用findwindow()找该窗体的句柄的话,因为这个API函数限于基于DESKTOP的窗体,如果你创建的窗体属于
child windows,那就无法获取。
倒是jasper的方法应该是可行的,但是我对线程太不熟悉了,所以,希望jasper,能不能写个例子
看看,就以调用d:/pic.exe为例,不知道可以吗?(pic.exe是一个用winrar创建的自解压缩
程序)谢谢了~!
 
用enumchildwindow看看。
 
to flyingQQ, :

你调用的程序创建的主窗体的caption 不能获得吗?应该就是它独立运行时的
标题栏上的字符了。现在你要关闭的是一个程序,而不是该程序打开的子窗体,
我想findwindow()可用的,如果不行,用enumchildwindow看看。
 
jasper的方法应该是可行的,关键是得到进程句柄或者进程号,应该有api的.

嘿嘿,其他的我也不知道了.
 
jasper说得对。用shellexecute得不到进程句柄,自然也不能对进程进行操作了。
CreateProcess就可以,只是比较麻烦。
结束进程可以用TerminateProcess函数,也可以发wm_close消息。 
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
implementation

{$R *.DFM}

function WinExecExW(cmd,workdir:pchar;visiable:integer):DWORD;
begin
FillChar(StartupInfo,SizeOf(StartupInfo),#0);
StartupInfo.cb:=SizeOf(StartupInfo);
StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow:=visiable;
if not CreateProcess(nil,cmd,nil,nil,false,Create_new_console or Normal_priority_class,nil,nil,StartupInfo,ProcessInfo) then
result:=0
else
Result:=1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
WinExecExW('g:/project1.exe','',1)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin

TerminateProcess(ProcessInfo.hProcess,0);
end;

end.
 
谢谢各位的热心帮助,我需要的都已经解决,不过我还有个问题就是楼上元无天所说的enumchildwindow函数,
我在API里面查不到说明,能不能解释一下,说说用法和参数值的类型等等,谢谢~!
 
多人接受答案了。
 
后退
顶部