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