我有一种复杂的场景
我们正在开发的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文件?
答案 0 :(得分:1)
也许这是一个愚蠢的解决方案,但只是把它扔出去,你可以使用taskkill命令? http://technet.microsoft.com/en-us/library/bb491009.aspx