Lotus Notes自动化报错:调用的对象已与客户端断开连接如何解决
问题根因
你遇到的The object invoked has disconnected from its clients是Lotus Notes COM调用的典型异常,触发在NUIDocument.Close行的核心原因是:
当你调用NFwdUIDocument.Send并关闭转发邮件窗口后,你之前打开的原始邮件对应的NUIDocumentUI对象,已经被Notes后台自动释放了,此时再主动调用Close方法,目标COM对象已经不存在,就会抛出该错误。
你之前添加的固定Sleep延迟不可靠,Notes的响应速度受邮件大小、系统负载、内存占用等多因素影响,固定时长无法覆盖所有场景。
解决方法
- 方案1:保留现有UI操作逻辑,优化对象销毁流程
把原来循环判断当前文档、关闭原始邮件的代码段全部删除,替换为带错误捕获的安全释放逻辑,避免操作已经被释放的对象:
On Error Resume Next If Not NUIDocument Is Nothing Then ' 仅当对象存活时执行关闭 NUIDocument.Close Set NUIDocument = Nothing End If On Error GoTo 0
也可以直接去掉原始邮件的关闭步骤,你打开原始邮件时传入的第一个参数是False,也就是只读模式,就算不手动关闭,Notes也会自动回收该窗口,不会造成资源残留。
- 方案2:改用后台非UI逻辑实现转发,从根源避免问题
Lotus Notes支持不用打开UI窗口就完成邮件转发,完全避开UI层异步操作带来的对象释放问题,执行效率也更高,改造后的核心逻辑示例:
If Not NDocument Is Nothing Then ' 后台生成转发邮件,无需打开UI窗口 Dim NFwdDoc As Object Set NFwdDoc = NDocument.Forward() NFwdDoc.SendTo = forwardToEmailAddresses ' 写入HTML内容可以直接操作富文本字段,不需要调用UI的Import方法 Dim rtBody As Object Set rtBody = NFwdDoc.GetFirstItem("Body") Call rtBody.Import("HTML File", "HTML DIRECTORY") ' 发送邮件,参数False表示不需要保存到已发送 Call NFwdDoc.Send(False) ' 不需要处理任何UI窗口关闭逻辑 Set NFwdDoc = Nothing Else MsgBox vbCrLf & findSubjectLike & vbCrLf & "not found in Inbox" End If
该方案完全不需要操作UI层对象,不会出现对象断开的异常,同时也不需要加任何Sleep延迟,稳定性远高于UI操作方案。
内容的提问来源于stack exchange,提问作者Drawleeh
相关产品推荐
相关产品推荐

