如何在Access中的Application.run之后关闭文件句柄

时间:2013-03-27 08:57:54

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

我有一种复杂的场景

我们正在开发的Access-Application在另一个Access-Application中调用VBA函数,然后通过调用“调用”Access-Application来触发Install Routine。 两个应用程序都是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开放的Filehandle。

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

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

第一: 我试图调用Run on Access-Application-Object并在之后关闭该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

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

第二: 在使用以下命令调用Admin.accda中的RegisterPlugIn后,我尝试关闭PlugIn数据库:

CodeProject.CloseCurrentDatabase

但这对以往没有任何影响: - (

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

1 个答案:

答案 0 :(得分:1)

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

相关问题