问题一:我想实现如下功能:
在一个程序中调用另一个exe文件,并传参数,都已成功,但现在有一个问题就是:
我想调用b.exe后,执行b.exe的一个过程RunProc,我在FormShow事件中调用这个过程,得到的结果却是该过程执行完了我才看到Form打开,请问怎么样才能Form打开后看着RunProc执行,
是不是不应该在FormShow事件中调用该过程?
不知大家明白我的意思否?帮帮忙,谢谢!(附代码)
//调用b.exe
procedure TFormCall.Button1Click(Sender: TObject);
begin
shellexecute(handle,'open','b.exe','x','',sw_shownormal);
end;
//取参数并执行过程RunProc
procedure TMainForm.FormShow(Sender: TObject);
var pam:string;
begin
pam:=paramstr(1);
if pam='x' then
RunProc; //执行一个过程
end;
问题二:
如何在调用b.exe之前判断b.exe是否在运行,如果正在运行,则关闭b.exe?现在最急是解决第一个问题!
在一个程序中调用另一个exe文件,并传参数,都已成功,但现在有一个问题就是:
我想调用b.exe后,执行b.exe的一个过程RunProc,我在FormShow事件中调用这个过程,得到的结果却是该过程执行完了我才看到Form打开,请问怎么样才能Form打开后看着RunProc执行,
是不是不应该在FormShow事件中调用该过程?
不知大家明白我的意思否?帮帮忙,谢谢!(附代码)
//调用b.exe
procedure TFormCall.Button1Click(Sender: TObject);
begin
shellexecute(handle,'open','b.exe','x','',sw_shownormal);
end;
//取参数并执行过程RunProc
procedure TMainForm.FormShow(Sender: TObject);
var pam:string;
begin
pam:=paramstr(1);
if pam='x' then
RunProc; //执行一个过程
end;
问题二:
如何在调用b.exe之前判断b.exe是否在运行,如果正在运行,则关闭b.exe?现在最急是解决第一个问题!
在调用b.exe前
var
th:hwnd;
begin
th:=0;
th:=findwindow(nil,b.exe的标题);
if th<>0 then
begin
sendmessage(th,wm_close,0,0);
end
else
begin
shellexecute();
end;
使用匿名管道通知b.exe,b.exe自己调用RunProc.2-》
使用互斥对象
procedure TForm1.FormActivate(Sender: TObject);
var pam:string;
begin
pam:=paramstr(1);
if pam='x' then
RunProc; //执行一个过程
end;
在b.exe的mainform上放个定时器,interval设为500,enable默认为false,formshow时将定时器enable为true。
在定时器的事件内第一句将enable改为false,然后执行runproc即可第二个问题,简单的方法,你可以在a.exe中用windows api:FindWindow
第一个参数传你的b.exe的MAINFORM的类名,第二个参数可传nil值。
建议你看一下FindWindow的帮助。
shellexecute(handle,'open','b.exe','x','',sw_shownormal);然后在窗体的OnShow里
发送这个消息就可以了
SendMessage 是等b.exe运行结束,再运行下面的代码PostMessage 则把消息发送出去后,立刻往下执行
begin
self.Show;
self.Repaint;
Application.ProcessMessages;
end;
var H: THandle;
begin
h := findwindow(nil,b.exe的标题);
if h>0 then
sendmessage(h,wm_close,0,0);
Application.ProcessMessages;
...
ShellExecute(...)