从 Delphi 打开和关闭外部程序

open and close an external program from Delphi

在我的应用程序 (Delphi XE10) 中,我想使用用户的默认编辑器(MSword 或 OpenOffice writer 或其他)打开一个文件 (RTF),并能够从我的应用程序中关闭该编辑器。 我尝试使用下面的代码但没有成功关闭编辑器

procedure TForm1.Button1Click(Sender: TObject);
var hApp : Cardinal;
begin
    hApp := StartApp('open','temp.rtf','','',sw_normal);
    anotherForm.showmodal;
    KillProcess(hApp);
end;

其中:

function StartApp(apchOperation, apchFileName, apchParameters, apchDirectory: PChar;awrdShowCmd: Word): Cardinal;
var
    lseiInfo: TShellExecuteInfo;
begin
    Result := 0;
    FillChar(lseiInfo, SizeOf(lseiInfo), Chr(0));
    lseiInfo.cbSize := SizeOf(lseiInfo);
    lseiInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
    lseiInfo.lpVerb := apchOperation;
    lseiInfo.lpFile := apchFileName;
    lseiInfo.lpParameters := apchParameters;
    lseiInfo.lpDirectory := apchDirectory;
    lseiInfo.nShow := awrdShowCmd;
    if Boolean(ShellExecuteEx(@lseiInfo)) then
    Result := lseiInfo.hProcess;
end;

procedure   KillProcess(hProcess: Cardinal);
Var
  ovExitCode: LongWord;
begin
    try
        if hProcess <> 0 then begin
            GetExitCodeProcess(hProcess, ovExitCode);
            if (ovExitCode = STILL_ACTIVE) or (ovExitCode <> WAIT_OBJECT_0) then
            TerminateProcess(hProcess, ovExitCode);
            CloseHandle(hProcess);
        end;
    except
    end;
end;

编辑器打开,但当它必须使用 KillProcess 关闭时,ovExitCode 始终为零,因此 TerminateProcess 不会执行。我也尝试在任何情况下执行 TerminateProcess,但编辑器(在本例中为 MSword)没有关闭。

你能帮帮我吗? 提前致谢

我建议放弃 KillProcess 方法,改用 SendMessage() 和 WM_CLOSE。这样您的应用程序将以 "normal" 方式退出。您可以从进程句柄中获取 window 句柄,这里有描述: