【问题标题】:Close Shell.Application Instance关闭 Shell.Application 实例
【发布时间】:2020-05-27 05:29:27
【问题描述】:

我正在编写一个脚本,通过基于this SO answer 的 Windows shell 使用默认程序打开文档:

Dim Shex As Object
Set Shex = CreateObject("Shell.Application")
tgtfile = "C:\Nax\dud.txt"
Shex.Open (tgtfile)

我注意到Shell.Application 的实例永远不会关闭。在我的代码中,我是Set Shex = Nothing,但这足够了吗?例如,如果我创建一个 Word 或 Outlook 实例,我需要使用 .Quit 将其关闭,然后再将变量设置为空。这里没有明显类似的情况。

我设置了对Microsoft Shell Controls and Automation 的引用来探索Shell 对象,但找不到.Application.Parent 属性的任何方法,更不用说看起来像.Quit 的方法了。

我是否遗漏了一些明显的东西?垃圾收集器是否也以某种方式摆脱了实例?它是特定于 shell 对象本身的东西吗?

【问题讨论】:

  • 我认为您并没有真正实例化应用程序;在 VBA 中创建的对象只允许您从 Shell GUI 获得对相同文件/文件夹层次结构的相同访问权限,因此一旦将对象设置为空,它就消失了。
  • 或者换一种说法,你只是在实例化一个类,它为你提供了一个访问这个、那个和另一个的接口,而不是一个真正的独立应用程序。
  • 您可能会发现此讨论很有帮助:stackoverflow.com/questions/42164719/how-to-destroy-an-object。一种建议是限制对象存在的范围,方法是在“with”语句中框定它。

标签: vba windows-shell


【解决方案1】:

考虑一下,我很确定@jamheadart 是正确的,我只是在实例化一个 VBA 类而不是在 Windows 中创建一个应用程序类。

不过,可以肯定的是,我接受了@Mert Y 的建议,即使用上下文管理器来限制范围。

最终代码:

With CreateObject("Shell.Application")
    .Open (strPath)
End With

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 2015-01-31
    • 2015-09-07
    • 2014-03-17
    相关资源
    最近更新 更多