我正试图抓住MS Access 2010+的运行实例(在Win10上),但是通常的提示; GetObject(, "Access.Application")
...仅适用于我自己用脚本启动的隐藏实例,但不用户从GUI启动的任何实例。
是的,在WMI和GetObject上,我已经阅读过10个或更多关于这个主题的谷歌点击,但我似乎错过了一些重要的东西。
但是,我已经尝试了下面的代码,我可以用这种方式获取运行Access实例的任何进程,我甚至可以.terminate()它们,但是,这是不我想做什么。相反,我想抓住进程并将其分配给可用的(正确类型)Access变量(请参阅下面代码中的“OutInstance”):
[ 编辑 :使用WHERE子句,并跳过Exit以检索最后一个实例]
Public Function GetRunningInstance(sAppName sComputer, ByRef OutInstance)
Dim oWMIService
Dim wProcesses
Dim oPrc
GetRunningInstance = False
Set OutInstance = Nothing
if sComputer = "" then sComputer = "."
Set oWMIService = GetObject("winmgmts:" & "{impersonationLevel=" & _
"impersonate}!\\" & sComputer & "\root\cimv2")
Set wProcesses = oWMIService.ExecQuery ("SELECT * FROM Win32_Process " & _
"WHERE Name = '" & sAppName & "'")
For Each oPrc in wProcesses
''' oPrc.Terminate() ''' Works, I can shut down Access...
Set OutInstance = oPrc
GetRunningInstance = True
''' By not exiting we get the last instance.
Next
End Function
现在,在尝试获取实例后,如何将流程“转换”为此VBScript中可用的Access应用程序变量?
Sub Test_DoStuff()
Dim InstProc
Dim AccessApp
If GetRunningInstance("msaccess.exe", "127.0.0.1", InstProc) Then
Set AccessApp = ''' cast 'InstProc' to my "Access.Application" somehow?
Else
Set AccessApp = CreateObject("Access.Application")
End If
'''
''' Doing my stuff
'''
AccessApp.CloseCurrentDatabase
AccessApp.DoCmd.Quit
End Sub
Test
我(也)不明白为什么GetObject(, "Access.Application")
在所有情况下都不起作用。权限? (我知道关闭当前用户正在使用的数据库是“不安全的”,但也可以处理)。
// Rolf