如何通过OLE自动化彻底关闭LibreOffice Calc(Delphi实现)
LibreOffice Calc OLE自动化关闭后残留soffice进程问题
通过OLE自动化打开LibreOffice Calc后,窗口可正常关闭,但soffice进程会残留在任务管理器中,无法彻底终止LibreOffice程序。测试环境为Windows 7系统搭配LibreOffice 6。
打开表格的Delphi代码
Office: Variant; frame: Variant; Desktop: Variant; comp: Variant; Doc: Variant; args: Variant; Office := CreateOleObject('com.sun.star.ServiceManager'); desktop := Office.CreateInstance('com.sun.star.frame.Desktop'); args := VarArrayCreate([0,1], varVariant); Doc := desktop.loadComponentFromURL('private:factory/scalc', '_blank', 0, args);
尝试过的两种无效关闭方式
方式一:调用Dispose释放对象
Doc.Dispose; frame := Desktop.FindFrame('_blank', 0); frame.Dispose; Desktop.Dispose; Office.Dispose;
方式二:调用Close后释放对象
Doc.Close(True); sleep(500); Desktop.Dispose; Office.Dispose;
以上两种方式仅能关闭Calc窗口,但soffice进程仍会残留。
参考的Java可行示例(无法在Delphi编译)
xModifiable = (XModifiable)xComponent; xModifiable.setModified(false); xCloseable = (XCloseable)xComponent; xCloseable.close(true); // 此代码会关闭所有实例,包括未创建的实例 // 不执行此操作的话,taskmgr中会残留soffice.bin进程 XDesktop xDesktop = (XDesktop)xCLoader; if(xDesktop != null) xDesktop.terminate();
可行的Delphi解决方案
要彻底关闭LibreOffice并清除残留进程,需按以下步骤操作:
- 将文档标记为未修改,避免关闭时弹出保存确认框
- 调用文档的Close方法关闭窗口
- 调用Desktop的Terminate方法彻底终止整个LibreOffice进程
对应的Delphi代码:
// 标记文档为未修改,跳过保存提示 Doc.setModified(False); // 关闭文档窗口 Doc.Close(True); // 彻底终止LibreOffice进程 Desktop.Terminate; // 释放Variant对象 Doc := Unassigned; Desktop := Unassigned; Office := Unassigned;
说明:
setModified(False)确保文档不会触发保存提示,避免进程因等待用户交互而残留Terminate方法会关闭所有LibreOffice的实例和后台进程,彻底清除任务管理器中的soffice进程
内容的提问来源于stack exchange,提问作者Shaun Ross
相关产品推荐
相关产品推荐

