我想打开一个文件,该文件最初保存到 SQL 表,但在调用 ShellExecuteEx 之前保存到磁盘。保存后,我现在有一个有效的文件路径,理论上应该能够使用此功能来实现我的目标。我需要该程序在其适当的程序中打开文件并等到该程序关闭后再继续。目前代码将启动正确的应用程序并打开传递的文件,但它无需等待(我知道这是因为我显示一条消息以指示应用程序何时终止)并且我编写的应该启动正确程序的应用程序关闭. 它显示消息,然后启动程序。我承认我并不完全理解 ShellExecuteEx 的工作原理,并且我已经将我在网上找到的代码与我的代码结合使用来达到预期的结果。您将在下面找到代码。任何帮助将不胜感激。
procedure Fire(FileStr: String);
var
SEInfo: TShellExecuteInfo;
ExitCode: DWORD;
ExecuteFile, ParamString, StartInString: string;
begin
ExecuteFile:= FileStr;
FillChar(SEInfo, SizeOf(SEInfo), 0) ;
SEInfo.cbSize := SizeOf(TShellExecuteInfo);
with SEInfo do
begin
fMask := SEE_MASK_NOCLOSEPROCESS;
Wnd := Application.Handle;
lpFile := PChar(ExecuteFile) ;
nShow := SW_SHOWNORMAL;
end;
if ShellExecuteEx(@SEInfo) then
begin
repeat
Application.ProcessMessages;
GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
ShowMessage('App terminated') ;
end
else ShowMessage('Error starting App') ;
end;
我意识到我正在写入磁盘的文件尚未完成,这就是该消息出现在程序之前的原因。在将文件写入磁盘的调用之后添加另一个 application.Processmessages 解决了这个问题。但是,当被调用的应用程序打开时,GetExitCodeProcess 仍然不会返回 STILL_ACTIVE 的值。
在做了更多的研究之后,我决定提出一个新问题,更明确地指出我想要完成的事情。如果有人有兴趣关注它,你可以在这里找到它