最初は SQL テーブルに保存されているが、ShellExecuteEx を呼び出す前にディスクに保存されているファイルを開きたいと考えています。保存すると、有効なファイルパスが得られ、理論的にはこの機能を使用して目標を達成できるはずです。適切なプログラムでファイルを開き、そのプログラムが閉じるまで待ってから続行するプログラムが必要です。現在、コードは正しいアプリケーションを起動し、渡されたファイルを開きますが、待機せずにこれを実行し (アプリケーションがいつ終了するかを示すメッセージを表示するのでわかります)、正しいプログラムを起動するはずの作成したアプリが閉じます. メッセージを表示し、プログラムを起動します。私は ShellExecuteEx がどのように機能するかを完全には理解しておらず、Web で見つけたコードを自分のコードと組み合わせて使用して、目的の結果を達成したことを認めます。以下にコードを示します。どんな助けでも大歓迎です。
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 の値を返しません。
さらに調査を行った後、私が達成しようとしていることをより明確に示す新しい質問を開くことにしました。興味がある人は、ここで見つけることができます