0

我有一种复杂的场景

我们正在开发的访问应用程序调用另一个访问应用程序中的 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 有 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 文件?

4

1 回答 1

1

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

于 2013-03-28T14:46:19.200 回答