程序调用问题!!!(200分)

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

yyqiheye

Unregistered / Unconfirmed
GUEST, unregistred user!
请问各位大侠,delphi中如何调用另一个可执行文件,最重要的是能够得到另一个执行文件的返回结果,即以阻塞的方式调用。例如在delphi中调用一个安装程序,安装程序执行完之后,delphi可以知道安装程序执行完了,再继续执行下一步操作。
能不能用线程来调用另一个程序呢?请高手指教!
 
执行一个程序并等待它结束
function ExecuteAndWaitProcess(
const ACmdLine : string;
const ACurrDir : string = ''
):Boolean;
var
SI: TStartupInfo;
PI: TProcessInformation;
begin
FillChar(SI, SizeOf(SI), 0);
SI.cb := SizeOf(SI);
SI.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
SI.wShowWindow := SW_HIDE;
Screen.Cursor := crHourGlass;
try
CreateProcess(
nil,
PChar(ACmdLine),
nil,
nil,
True,
0,
nil,
PChar(ACurrDir),
SI,
PI);
WaitForSingleObject(PI.hProcess, INFINITE);
Result := True;
finally
Screen.Cursor := crDefault;
end;
end;
 
我先也想到过,也在原来讨论中看到过类似的,但是还有一点点欠缺,不知道能不能解决?
就是如果另一个程序在调用过程中取消了,返回的结果也是TRUE,我想要确确实实的真实结果应该怎么办呢?
比如说另 一个安装程序在执行一半时被人为取消,那这时delphi知道程序是调用了,但是并没有成功执行,所以还是不能执行下一步操作应该如何处理呢?望指教!
还是要谢谢你的代码啊!先给100分吧!
 
function ExecuteProgram(const AFile, AParams: string;
const ShowCmd: integer;
const ASleep: integer): integer;
var
SI: PShellExecuteInfo;
I: LPDWORD;
begin
Result := 1;
New(SI);
try
SI.cbSize := SizeOf(ShellExecuteInfo);
SI.fMask := SEE_MASK_NOCLOSEPROCESS;
SI.Wnd := 0;
SI.lpVerb := nil;
SI.lpFile := PChar(AFile);
SI.lpParameters := PChar(AParams);
SI.lpDirectory := PChar(ExtractFilePath(AFile));
SI.nShow := ShowCmd;
if ShellExecuteEx(SI) then
begin
New(I);
repeat
GetExitCodeProcess(SI.hProcess, I^);
Sleep(ASleep);
Application.ProcessMessages;
until (I^ <> STILL_ACTIVE);

Result := I^;
Dispose(I);
end;
finally
Dispose(SI);
end;
end;
 
to dreamfly1024:
dreamfly1024兄的方法也是可行的,不过我觉得还是以李翔鹏兄的代码为佳。不知道有没有办法解决我后提出的那个问题呢?
 
晕呐, 你不是要返回值么, 我给你的代码已经取出返回值了, 你还要咋样?
 
to dreamfly1024:
是取回了返回值,但是返回值每次都是0 ,即不管另一个程序是正常执行了还是中途取消了,返回都是0。我想要的是正常执行完与中途取消返回不同的值。
 
多人接受答案了。
 
返回值是由被调用程序决定的, 如果他无论什么情况都返回 0, 你叫我有什么办法???
 
后退
顶部