【问题标题】:When calling Notes from Excel/VBA do I need to explicitly close the session?从 Excel/VBA 调用 Notes 时,我需要显式关闭会话吗?
【发布时间】:2015-03-13 16:52:55
【问题描述】:

我正在使用 Excel,通过对 Notes 服务器的 VBA 调用,根据 Notes 数据库中的数据绘制财务结果图表。它实际上是一个实时“更新”过程。 代码开始:

Set Session = CreateObject("Lotus.NotesSession") 'Start a session to notes
Call Session.Initialize
Set nam = Session.CreateName(Session.UserName)

但我没有明确指示会话关闭。我是不是该?我什至可以这样做吗?

我想在几个宏调用之后整个事情都会变慢,但这可能是其他的!

如果没有显式关闭它会使会话保持打开状态,我如何重新连接到它(无需再次登录)?

【问题讨论】:

  • CreateObject 返回一个 COM 对象。当所有引用都被删除时,它将(嗯,应该)“处理”/“关闭”自身。因为这是,嗯,COM 而不是 .CLR 的东西,我发现最好手动“释放”代码引用(例如,完成后,Set Session = Nothing)。见stackoverflow.com/questions/19038350/… 效果是一样的变量超出范围,但注意变量的生命周期。我建议对以这种方式获得的所有对象进行严格的生命周期清理。

标签: excel lotus-notes vba


【解决方案1】:

你想要的方法是Session.Close

是的,user2864740 非常正确:您必须明确地将对象设置为 Nothing。

此外,我建议您关闭由 Session 创建的每个对象,也将它们设置为 Nothing:您永远不应假设任何对象在超出范围时已被解除和清理 - 如果它们中的任何一个都保持活动状态,它可以保留对父对象的引用,从而使会话保持活动状态并且您尝试关闭它时无法访问。

如果您没有明确关闭会话,并且在您放弃指向它的每个对象变量后它仍然处于打开状态,那么它可能超出了 VBA 的范围。

一些对象可以通过 GetObject() 调用获取,如果它们已经在运行,但 Lotus Notes 会话对象不支持该接口。

下一步是使用 API 调用枚举正在运行的进程,按名称选择 Lotus Notes 会话 PID,然后终止进程

使用“处理”API 调用的替代方法是 WMI 脚本,MSDN 在此处提供了相关调用的 VBScript 列表:

https://msdn.microsoft.com/en-us/library/aa394599%28v=vs.85%29.aspx

这比 API 调用更安全,但您仍应将此视为最后的手段:它可能会终止您现有的邮件会话,并且任务管理器(用于枚举进程和终止 PID 的 UI)向您发出警告是有原因的关于未保存的工作和系统不稳定。

【讨论】:

  • 尝试从 VBA 调用 session.close - 它说方法不支持!
  • 有趣:看起来您正在调用一组不同的 Lotus Notes 库,然后。尝试“退出”和“退出”。或者,对象已经关闭,并且没有正确报告 - 它引发错误“不支持”,而不是告诉您“关闭”仅在打开的对象上可用。
  • 还有一点工作... 如果您转到 VBE 工具菜单并声明对 Lotus Notes 自动化类的引用,对象浏览器将列出 'NotesSession' 和 ' 的所有属性和方法NotesDatabase 的类。我有点担心这些类的 'CLOSE' 方法只有在您右键单击“显示隐藏成员”的成员窗格时才可见。这表明 close 不再是这些类的受支持接口,并且它可能在以后的版本中不可用 - 尽管 Session.Close 方法仍在我当前客户端的桌面环境中工作。
猜你喜欢
  • 2017-03-19
  • 2013-06-10
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
相关资源
最近更新 更多