【问题标题】:How to close file handle after Application.run in Access如何在 Access 中的 Application.run 之后关闭文件句柄
【发布时间】:2013-03-28 22:46:19
【问题描述】:

我有一种复杂的场景

我们正在开发的访问应用程序调用另一个访问应用程序中的 VBA 函数,然后通过调用“调用”访问应用程序来触发安装例程。 这两个应用程序要么是 accda(用于 Access-AddIn),要么是编译后的 accde 文件。

Admin.accda -> PlugIn.accda (InstallPlugIn) -> Admin.accda (RegisterPlugIn)

Admin.accda 中的对应行如下所示:

Application.Run("\\Path\To\PlugIn\PlugIn.InstallPlugin", "Parameters")

除了一件事之外,一切都按预期进行。 Access 使 PlugIn.accda 上的文件句柄保持打开状态,直到我关闭 Admin.accda。

当我调试我的代码时,我可以看到在 Admin.accda 中调用 Application.Run() 后,PlugIn.accda 的 VBA 代码被加载到 Admin.accda 中,并且 PlugIn.accda (PlugIn.laccda) 的 Lockfile 得到创建的。当我的代码完成时,Lockfile 有 0 字节但仍然存在。

通过使用 Sysinternals 的 ProcessExplorer,我可以看到运行 Admin.accda 的进程仍然有一个对 PlugIn.accda 开放的文件句柄。

我想关闭该文件句柄,因为 PlugIn.accda 与打开的文件句柄无关,并且打开的文件句柄可能会干扰客户端客户端/服务器部署中的进程,例如将插件复制到客户端计算机。

到目前为止,我已经尝试了两种不同的方法,但都没有成功:

首先: 我尝试调用 Run on Access-Application-Object 并随后关闭该对象

  Dim oApplication As Object
  Set oApplication = CreateObject("Access.Application")
  oApplication.OpenCurrentDatabase Me.txtPathPlugIn
  If oApplication.Run("\\Path\To\PlugIn\PlugIn.InstallPlugin", "Params") Then
     'Do something
  End If
  oApplication.CloseCurrentDatabase
  Set oApplicaton = Nothing

使用这种方法,插件无法调用 Admin.accda 中的 RegisterPlugIn 函数,因为它是在另一个进程中独占打开的。

第二: 在 Admin.accda 中调用 RegisterPlugIn 后,我尝试使用以下方法关闭插件数据库:

CodeProject.CloseCurrentDatabase

但这并没有什么效果:-(

有没有办法通过使用一些 Windows-API 函数来关闭文件句柄?或者有没有人有更好的方法来动态注册额外的 Access 文件?

【问题讨论】:

  • 在将 'oApplication' 设置为空之前尝试调用 'oApplication.Quit'。看看这是否会为您释放句柄。

标签: ms-access vba ms-access-2010


【解决方案1】:

也许这是一个愚蠢的解决方案,但只是把它扔在那里,你可以使用 taskkill 命令? http://technet.microsoft.com/en-us/library/bb491009.aspx

【讨论】:

  • +1 表示“把它扔出去”。除了我在 .NET 应用程序中使用了System.Diagnostics.Process.GetProcessById().Kill 之外,我不得不做类似的事情来杀死“僵尸”MSACCESS 进程。
猜你喜欢
  • 1970-01-01
  • 2016-07-29
  • 2011-08-16
  • 2018-12-27
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
相关资源
最近更新 更多